2

Итак, я работаю над тем, что, как я думал, будет быстрым и легким проектом в течение пары часов, и я не могу заставить его работать! Это заставляет меня расстраивать LOL. Я должен быть рядом, но, возможно, нет.Как использовать статические объекты и методы !? C++ Frustration

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

HERES ОШИБКИ:

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 

Любая помощь или предложения будут с благодарностью!

Heres мой код (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; 
} 

Мысли/Предложения/Вопросы/вопросы? Все, что поможет облегчить разочарование, вызвало у меня LOL. Мне кажется, слишком сложно вызвать у меня такую ​​проблему. Благодаря!

+0

Где мой Obj определен? - О, я это вижу. Нет, не делай этого. Вы не можете вызвать delete на статическом объекте или произойдет хаос ... –

+0

Я уверен, что c-smile правильно касается вашей проблемы, но в общем, пожалуйста, разместите фактические ошибки, которые вы получите. – SirPentor

+0

Я избавился от delete myObj; И я редактировал свой вопрос, чтобы добавить ошибки, которые я получаю. – ModdedLife

ответ

2

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

Singleton mySingletonObj;

должно быть в порядке:

Singleton& sRef = Singleton::instance();

Ссылки не переназначаемый:

sRef = Singleton::instance();

Должно быть в порядке:

sRef.sendOutput();

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

delete myObj;

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

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

Удивительный! Спасибо, это сработало! – ModdedLife

+0

@ModdedLife добро пожаловать – justin

2

Просто удалите delete myObj; здесь:

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

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

+0

Я удалил delete - heres мои ошибки: Singleton.h: В функции 'int main (int, char **)': Singleton.h: 28: 2: error: 'Singleton :: Singleton()' is private main.cpp: 38: 12: error: в этом контексте Singleton.h: 29: 2: error: 'Singleton :: ~ Singleton()' является приватным main.cpp: 38: 12: error: внутри этого context – ModdedLife

0

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

+0

Да, я только начал учиться использовать статику. – ModdedLife

Смежные вопросы