C++中的protected和private析构函数之间有什么区别吗?如果基类析构函数是私有的,我想在删除派生类对象时仍然会调用它.
如果我new在我的库中使用关键字(它的构建方式与我的主应用程序不同),当我在主应用程序中删除它时delete,是否有可能出现崩溃/错误?
为什么我可以在免费存储上创建具有私有析构函数的类的对象但不在堆栈上?
例如,这是非法的:
class Foo
{
public:
explicit Foo( int );
static void delete_foo(Foo* foo ) { delete foo; }
private:
int x;
~Foo();
Foo( const Foo& );
Foo& operator=(const Foo& );
};
int main()
{
Foo * fooptr = new Foo(5); // legal
Foo::delete_foo( fooptr ); // legal
Foo foo(5); // illegal
}
Run Code Online (Sandbox Code Playgroud) 我已经看到了代码,其中构造函数已被声明为私有,而析构函数是公共的.这种声明有什么用?析构函数是否需要公开,以便在继承期间调用是可能的,还是代码中的错误?
这个问题在信息上似乎有点短,但我真正想知道的是,当构造函数需要私有时遵守C++规则是否有公共析构函数?
假设我有以下代码:
class Example
{
#ifndef PRIVATE_DESTRUCTOR
public:
#endif
~Example() { }
public:
friend class Friend;
};
class Friend
{
public:
void Member();
};
void Friend::Member()
{
std::printf("Example's destructor is %s.\n",
IsDestructorPrivate<Example>::value ? "private" : "public");
}
Run Code Online (Sandbox Code Playgroud)
是否有可能实现IsDestructorPrivate上面的模板来确定一个类的析构函数是否private还是protected?
在我正在使用的情况下,我需要使用它的唯一时间IsDestructorPrivate是在有权访问这种私有析构函数的地方(如果存在的话).它不一定存在.IsDestructorPrivate允许是宏而不是模板(或者是解析为模板的宏).C++ 11很好.
请原谅我,如果已经提出这个问题,我没有找到任何特定问题的答案.
我在库中创建了一个类,我希望某些类能够创建和销毁,其他类可以访问其他公共函数.有一个friend class不是我想要的,因为朋友类将访问我不想要的成员变量和成员函数.我偶然发现了这个几乎可以工作的习语,除了析构函数,因为它不能采用其他参数.有了这个成语,我得到:
class B;
class A
{
public:
class LifecycleKey
{
private:
LifecycleKey() {}
friend class B;
};
A(LifecycleKey); // Now only class B can call this
// Other public functions
private:
~A(); // But how can I get class B to have access to this?
void somePrivateFunction();
// Members and other private functions
};
Run Code Online (Sandbox Code Playgroud)
如上面的代码中所提到的,该解决方案不允许仅class B访问析构函数.
虽然上述问题都没有任何影响,因为我总是可以将ctor和dtor公之于众,并且只是说"RTFM".
我的问题是:
有没有办法限制访问ctor和dtor到特定的类(但只有ctor和dtor),同时坚持更熟知的语法(如果人们想要的东西在堆栈上,通过删除销毁,等等)?
任何帮助是极大的赞赏!
解
在 A.h
class B;
class A
{
protected:
A() …Run Code Online (Sandbox Code Playgroud) 我想从函数返回一个类的实现.该功能在库中.我想阻止用户销毁我返回的对象.我怎样才能做到这一点?
编辑:示例.
与世界的接口:
class Base
{
public:
virtual void foo() = 0;
};
Base* GetFoo();
Run Code Online (Sandbox Code Playgroud)
实施 - 内部:
class Bar : public Base
{
public:
void foo() { //Do something}
};
Base* GetFoo()
{
return new Bar
}
Run Code Online (Sandbox Code Playgroud) 鉴于下面的代码,为什么我会得到关于A的析构函数是私有的错误?显然它是私有的,但我不明白为什么以这种方式初始化B的对象实例会导致调用A的析构函数.
对于任何拼写错误道歉,我正在从非联网系统重新创建内存中的代码,并且没有编译器.
class A
{
public:
A(int val) : x(val) {}
private:
int x;
~A() {}
};
class B
{
public:
B() : aInstance() {}
private:
A aInstance;
};
int main()
{
B b;
}
Run Code Online (Sandbox Code Playgroud)