Так что я уже пару часов работаю над тем, что я думаю, будет быстрым и легким проектом, и я не могу заставить его работать! Это расстраивает меня, лол, я должен быть рядом, но, может быть, нет.
Я включу свой код с комментариями, объясняющими, что он должен делать. По сути это использование частного конструктора и деструктора. Целое число члена, а затем открытая статическая функция, возвращающая ссылку на объект в классе, и открытая функция, которая должна отображать целое число члена и увеличивать его. Я продолжаю получать ошибки объема и инициализации.
ЗДЕСЬ ОШИБКИ:
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;
}
Думал / Предложения / Вопросы / проблемы?
Что-нибудь поможет облегчить разочарование, которое это вызывает у меня, смеется. Это кажется слишком простым, чтобы вызвать у меня такую проблему. Спасибо!
Запрещено в этой области:
Singleton mySingletonObj;
Должно быть хорошо:
одиночка& 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 ();» не будет компилироваться (и не должно логически). Кроме этого все в порядке.