我一直在阅读这里的其他问题,有些事情让我感到困惑,希望能得到解释。我敢肯定这是一件简单的事情,但它在暗示我。所以在C++中,我们有只能在类中查看的私有(private)变量:classMyClass{private:inti;};但我们也可以有未命名的命名空间:namespace{inti;}两者似乎都是类私有(private)的,但在第二种情况下,您无法从头文件中看到它们的存在。从阅读其他问题来看,函数似乎有所不同,因为您不能将类对象传递给它们?但我不确定这里的变量有什么区别。第二种方法是否有缺点,这意味着您仍应使用私有(private)变量? 最佳答案
假设我有一个带有一些constreference成员变量的类,我想禁止某种类型的构造。所以我会声明相应的构造函数私有(private)。当然,构造函数必须初始化类的所有constreference成员变量。然而,这样做会导致代码看起来很奇怪:classA{};classB{B(constA&a):host(a){}private:B():host(A()){}//Thisisuglyandnotneeded!!constA&host;};除了将构造函数声明为私有(private)之外,还有其他方法可以禁止某种构造类型吗?我不想让编译器为我编写构造函数。 最佳
我有一个具有5个静态公共(public)函数和1个静态私有(private)函数(从其中一个公共(public)函数调用)的类。该类没有任何成员变量。在我看来,它应该是一个命名空间而不是一个类。但是如何处理私有(private)函数呢?我不希望每个命名空间用户都可以访问它,但命名空间中没有访问控制。 最佳答案 我知道有两种方法不要在标题中声明它们一种方法是不在header中声明这些函数。它们只能放在实现文件中的未命名namespace中。事实上,您随后必须在实现文件中实现访问此私有(private)函数的任何函数(而不是在heade
以下代码无法编译,显示“错误C2248:‘A::getMe’:无法访问类‘A’中声明的私有(private)成员”。为什么?我正在尝试调用公共(public)接口(interface)。classB{};classA{public:constB&getMe()const;private:B&getMe();};intmain(){Aa;constB&b=a.getMe();return0;} 最佳答案 其他答案中未提及的部分问题是可访问性和可见性在C++中是独立的概念。B&A::getMe()私有(private)成员在main中可
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Canobjectswithprivatecopyconstructorsbethrown?据我所知,当你将对象作为值时,应该创建拷贝。因此,如果存在,则应调用复制构造函数。如果复制构造函数存在并且是私有(private)的,那么这应该会导致编译错误。这是代码示例classException{public:Exception(){cout接下来的代码应该会导致编译错误。try{Exceptionlocal;throwlocal;}catch(...){}但是在VS2005和VS2008中都成功地编译了该代码并
在很多情况下,我想覆盖一个Qt类来扩展或修改它的行为。但是几乎所有的Qt类都使用了一个内部私有(private)类,例如QNetworkDiskCache内部的QNetworkDiskCachePrivate。我知道这种方法有很多优点。但是私有(private)类有一个巨大的问题:它使得覆盖类变得更加困难。对于其他带有源代码的C++类库,我通常会重写一个类方法,从父类中的实现中复制代码,并在这里或那里进行小的修改以实现我想要的行为。但是,在Qt中,私有(private)类不被导出,对派生类不可见。由于Qt类通过“d”成员在私有(private)类中维护关键的内部数据,私有(privat
我从g++中收到一个非常不寻常的错误,声称类型别名是私有(private)的。在减少代码数小时后,我得出了以下最小测试用例:templateclassTest{structCatDog{staticvoidmeow(){CrazyHouse::TheCatDog::meow();}structDog{staticvoidbark();};};structCrazyHouse{usingTheCatDog=CatDog;staticvoidstartMadness(){TheCatDog::meow();TheCatDog::Dog::bark();}};public:staticvoi
我想做这样的事情:templateclassFoo{...public:voidDoSomething(){compile_time_if(TisClassA){m_T.DoThingOne();m_T.DoThingTwo();}DoSomeFooPrivateThing();m_T.DoThingThree();}Tm_T;};在这种情况下,我知道所有有效的T都实现了DoThingThree,但只有ClassA实现了DoThingOne和DoThingTwo。这不是鸭子打字的事情,我只想为ClassA做这个额外的部分,我不想将这些方法添加到其他可能的T。我无法进行转换,因为可能的T
我认为理论上这个问题的答案是肯定的。然而,在实践中,我的编译器(VS2010)似乎并没有在以下情况下提示:我有一个抽象基类提供一些公共(public)接口(interface)(但没有数据成员)和从它派生的各种子类和子子类。classBase{public:Base(){}virtual~Base(){}virtualvoidinterfaceFunction1()=0;virtualvoidinterfaceFunction2()=0;private:Base(constBase&);//allderivedclassesshouldbeuncopyableBase&operator
我正在阅读this关于自定义类型的Qt文档页面,它声明如下:Thedefaultconstructor,copyconstructoranddestructorareallrequired,andmustbepublic,ifthetypeistobeintegratedintothemeta-objectsystem.假设我有一个对象需要使用一些必需的参数来构建,因为使用默认构造函数构建它没有意义,例如:structIntPair{IntPair(intfirst,intsecond);~IntPair();};如文档所述,要使其在Qt元对象系统中可用,它需要默认构造函数。但实际上,