所以我一直在研究我认为快速简单的项目现在几个小时,我无法让它工作!这让我感到沮丧lol我必须亲近,但也许我不是。
我会在代码中加入解释它应该做什么的评论。本质上它使用私有构造函数和析构函数。一个成员整数,然后是一个公共静态函数,用于返回对类中对象的引用 - 以及一个应该显示成员整数并递增它的公共函数。我不断收到范围和初始化错误。
这是错误:
Singleton.h: In function ‘int main(int, char**)’:
Singleton.h:28:2: error: ‘Singleton::Singleton()’ is private
main.cpp:38:12: error: within this context
Singleton.h:29:2: error: ‘Singleton::~Singleton()’ is private
main.cpp:38:12: error: within this context
非常感谢任何帮助或建议!
继承我的代码(Singleton.h,Singleton.cpp,main.cpp):
Singleton.h:
#ifndef SINGLETON_H
#define SINGLETON_H
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
class Singleton {
public:
static Singleton& instance(); //returns a reference to a Singleton obj
void sendOutput(); //prints member variable and increments it
private:
int myInt; //member integer-variable
Singleton(); //constructor
~Singleton(); //destructor
};
#endif
Singleton.cpp:
#include <string>
#include "Singleton.h"
using namespace std;
//Displays to console that the obj was created. Initializes the member variable
Singleton::Singleton(){
myInt = 0; //member variable
cout << "Singleton Object Created!" << endl;
}
//destructor - displays to console that the Singleton object was destructed
Singleton::~Singleton(){
// delete myObj;
cout << "Singleton Object Destructed!" << endl;
}
//display member variable value and increment
void Singleton::sendOutput(){
cout << "Request to send data to output to console" << endl;
cout << "Integer Value: " << myInt << endl;
myInt++;
}
//REQUIRED: Static method with a reference to an object of this class return type
//create a static Singleton object and return it
Singleton& Singleton::instance(){
static Singleton myObj;
return myObj;
}
main.cpp:
#include "Singleton.h"
#include <string>
#include <iostream>
#include <cstdlib>
using namespace std;
//Another requirement - demo static variables
void static_test(){
static int a = 1;
cout << a << endl;
a++;
}
int main(int argc, char * argv[]){
static_test();
static_test();
static_test();
//messed around with this for awhile - got it to work a few times
//messed it up a few more times O.o
Singleton mySingletonObj;
Singleton& sRef = Singleton::instance();
//sRef = Singleton::instance();
sRef.sendOutput();
return 0;
}
思想/建议/问题/顾虑? 什么都有助于缓解这一直导致我的沮丧。导致我出现这样的问题似乎太简单了。谢谢!
答案 0 :(得分:2)
在这里删除delete myObj;
:
Singleton::~Singleton(){
delete myObj;
cout << "Singleton Object Destructed!" << endl;
}
它应该有效。 myObj是静态分配的,因此将在进程退出时被运行时删除。
答案 1 :(得分:2)
在该范围内被禁止:
Singleton mySingletonObj;
应该没问题:
的Singleton&安培; sRef = Singleton :: instance();
参考文献无法重新分配:
sRef = Singleton :: instance();
应该没问题:
sRef.sendOutput();
另外,删除它 - 该语言已经指定了对象的生命周期和存储空间,并负责破坏它:
删除myObj;
您还应delete
复制该类型的能力:
Singleton(); //constructor
Singleton(const Singleton&) = delete; // deleted copy constructor
答案 2 :(得分:0)
首先,在开始编写程序之前,你应该先了解语言的基础知识。从你的代码看起来你试图删除myObj,它是来自另一个方法的本地静态对象而在析构函数中不可见,更不用说你只能在指针上调用delete而应该只删除operator new初始化的指针。 您的单例也应该有私有或删除(对于C ++ 11)复制构造函数和赋值运算符。如果你这样做:“sRef = Singleton :: instance();”不会编译(它不应该逻辑)。除此之外一切都很好。