【发布时间】:2013-10-29 20:01:07
【问题描述】:
我已经问过一个与私有析构函数相关的问题 (Use of making destructor private),但我已经以下面这个问题结束了,但我仍然不明白确切的答案。
问题:
为什么当我创建一个具有私有析构函数的类对象时会调用私有析构函数?但不是当我创建一个普通对象时。
案例一
// myclass.h
#include <iostream>
class MyClass {
public:
static MyClass& GetInstance();
void Display();
private:
MyClass();
virtual ~MyClass();
};
MyClass::MyClass() {
std::cout << "Constructor " << std::endl;
}
MyClass::~MyClass() {
std::cout << "Destructor" << std::endl;
}
MyClass& MyClass::GetInstance() {
static MyClass _instance;
return _instance;
}
void MyClass::Display() {
std::cout << "Hello" << std::endl;
}
// main.cpp
#include "myclass.h"
#include <iostream>
int main() {
MyClass::GetInstance().Display(); //case1
std::cout << "main finished!" << std::endl;
return 0;
}
// output
Constructor
main finished
Destructor.
案例二
// myclass.h
#include <iostream>
class MyClass {
public:
void Display();
MyClass();
virtual ~MyClass();
};
MyClass::MyClass() {
std::cout << "Constructor " << std::endl;
}
MyClass::~MyClass() {
std::cout << "Destructor" << std::endl;
}
MyClass& MyClass::GetInstance() {
static MyClass _instance;
return _instance;
}
void MyClass::Display() {
std::cout << "Hello" << std::endl;
}
// main.cpp
#include "myclass.h"
#include <iostream>
int main() {
MyClass testObj;
std::cout << "main finished!" << std::endl;
return 0;
}
// Error
1>e:\programs\cpp_test\src\main.cpp(38): error C2248: 'MyClass::MyClass' : cannot access private member declared in class 'MyClass'
1> e:\programs\cpp_test\static_single_test.h(11) : see declaration of 'MyClass::MyClass'
1> e:\programs\cpp_test\static_single_test.h(6) : see declaration of 'MyClass'
1>e:\programs\cpp_test\src\main.cpp(38): error C2248: 'MyClass::~MyClass' : cannot access private member declared in class 'MyClass'
1> e:\programs\cpp_test\static_single_test.h(12) : see declaration of 'MyClass::~MyClass
编辑
我知道当我们“仅需要基于堆的对象”时,需要将析构函数设为保护/私有。
【问题讨论】:
-
您在 2. 案例中遇到的错误表明您正在使用 1. 案例中的头文件。如果你使用了你声称使用的头文件,你应该得到一个关于 GetInstance() 未声明而不是构造函数/析构函数的错误。因此,请仔细检查您的设置。
标签: c++ constructor