Как мне использовать статические объекты и методы!? С ++ разочарование

Так что я уже пару часов работаю над тем, что я думаю, будет быстрым и легким проектом, и я не могу заставить его работать! Это расстраивает меня, лол, я должен быть рядом, но, может быть, нет.

Я включу свой код с комментариями, объясняющими, что он должен делать. По сути это использование частного конструктора и деструктора. Целое число члена, а затем открытая статическая функция, возвращающая ссылку на объект в классе, и открытая функция, которая должна отображать целое число члена и увеличивать его. Я продолжаю получать ошибки объема и инициализации.

ЗДЕСЬ ОШИБКИ:

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

Думал / Предложения / Вопросы / проблемы? Что-нибудь поможет облегчить разочарование, которое это вызывает у меня, смеется. Это кажется слишком простым, чтобы вызвать у меня такую ​​проблему. Спасибо!

3 ответа

Решение

Запрещено в этой области:

Singleton mySingletonObj;

Должно быть хорошо:

Singleton & sRef = Singleton:: instance ();

Ссылки не могут быть переназначены:

sRef = Singleton:: instance ();

Должно быть хорошо:

sRef.sendOutput ();

Кроме того, удалите это - язык уже определяет время жизни и хранения объекта и заботится о его уничтожении:

удалить myObj;

Вы должны также delete возможность копирования типа:

Singleton(); //constructor
Singleton(const Singleton&) = delete; // deleted copy constructor

Просто удали delete myObj; Вот:

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

и это должно работать. myObj статически размещен, поэтому будет удален во время выполнения при выходе из процесса.

Прежде всего вы должны понять основы языка, прежде чем приступить к написанию программ на нем. Из вашего кода похоже, что вы пытаетесь удалить myObj, который является локальным статическим объектом из другого метода и не видим в деструкторе, не говоря уже о том, что вы можете вызывать delete только по указателям и должны удалять только указатели, инициализированные оператором new. Также ваш синглтон должен иметь приватный или удаленный (для C++11) конструктор копирования и оператор присваивания. Если вы сделаете эту строку: "sRef = Singleton::instance();" не будет компилироваться (и не должно логически). Кроме этого все в порядке.

Другие вопросы по тегам