2

ですから、私は数時間、迅速で簡単なプロジェクトになると思っていたものに取り組んできましたが、それを機能させることができません!それは私をイライラさせています笑私は近くにいなければなりませんが、多分私はそうではありません。

コードに、何をすべきかを説明するコメントを含めます。基本的に、プライベートコンストラクタとデストラクタを使用します。メンバー整数と、クラス内のオブジェクトへの参照を返すパブリック静的関数、およびメンバー整数を表示してインクリメントするパブリック関数。スコープと初期化エラーが発生し続けます。

ここにエラーがあります:

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;
}

考え/提案/質問/懸念?これが私を引き起こしている欲求不満を和らげるのに役立つものは何でもあります笑。私にそのような問題を引き起こすのは単純すぎるようです。ありがとう!

4

3 に答える 3

2

ここから削除delete myObj;してください:

Singleton::~Singleton(){
    delete myObj;
    cout << "Singleton Object Destructed!" << endl;
}

そしてそれは動作するはずです。myObjは静的に割り当てられるため、プロセス終了時に実行時に削除されます。

于 2013-02-22T23:38:32.037 に答える
2

その範囲で禁止されています:

シングルトンmySingletonObj;

大丈夫なはず:

Singleton&sRef = Singleton :: instance();

参照は再割り当てできません:

sRef = Singleton :: instance();

大丈夫なはず:

sRef.sendOutput();

また、これを削除します-言語はすでにオブジェクトの存続期間とストレージを指定しており、オブジェクトの破棄を処理します。

myObjを削除します。

deleteタイプをコピーする機能も必要です。

Singleton(); //constructor
Singleton(const Singleton&) = delete; // deleted copy constructor
于 2013-02-22T23:43:31.013 に答える
0

まず、プログラムを書き始める前に、言語の基本を理解する必要があります。コードから、myObjを削除しようとしているように見えます。これは、別のメソッドからローカル静的オブジェクトであり、デストラクタには表示されません。もちろん、ポインタに対してのみdeleteを呼び出すことができ、演算子newによって初期化されたポインタのみを削除する必要があります。また、シングルトンには、プライベートまたは削除された(C ++ 11の場合)コピーコンストラクターと代入演算子が必要です。その行を実行する場合: "sRef = Singleton :: instance();" コンパイルされません(論理的にはコンパイルされません)。それ以外はすべて問題ありません。

于 2013-02-22T23:47:45.133 に答える