【发布时间】:2010-05-09 10:52:32
【问题描述】:
下面的代码根据环境变量实例化一个派生的单例对象。编译器错误提示 error C2512: 'Dotted' : no appropriate default constructor。我不明白编译器在抱怨什么。
编辑: 修复了实现需要定义父类和派生类的 get 实例方法的问题。通过将类定义分隔在单独的头文件中,并将其包含在实现实例函数的 Singleton.cpp 中。
Mainfile – 1
#include <iostream>
#include <string>
#include "Singleton.h"
using namespace std;
int main(){
Singleton::instant().print();
cin.get();
}
Singleton.h
#pragma once
#include <iostream>
using std::cout;
class Singleton{
public:
static Singleton & instant();
virtual void print(){cout<<"Singleton";}
protected:
Singleton(){};
private:
static Singleton * instance_;
Singleton(const Singleton & );
void operator=(const Singleton & );
};
Singleton.cpp
#include "Singleton.h"
#include "Dotted.h"
Singleton * Singleton::instance_ = 0;
Singleton & Singleton::instant(){
if (!instance_)
{
char * style = getenv("STYLE");
if (style){
if (strcmp(style,"dotted")==0)
{
instance_ = new Dotted();
return *instance_;
} else{
instance_ = new Singleton();
return *instance_;
}
}
else{
instance_ = new Singleton();
return *instance_;
}
}
return *instance_;
}
Dotted.h
#pragma once
class Dotted;
class Dotted:public Singleton{
public:
friend class Singleton;
void print(){cout<<"Dotted";}
private:
Dotted(){};
};
【问题讨论】:
-
我不是 C++ 程序员,但是像这样的超类可以使用受保护的构造函数吗?难道你不必让单身人士成为dotted的朋友吗?
-
@Lasse V. Karlsen 都没有工作:公开构造函数并使单例的 Dotted 成为朋友。
标签: c++ inheritance singleton compiler-errors