2015-06-14 2 views
-1

Я хочу реализовать одноэлементный класс, который получает путь к файлу в качестве параметра. Я попытался написать следующий код. Я знаю, что это не работает, и не хорошо, но я не могу найти, почему ..пытается реализовать простой ostream singleton class

class OutputData { 
    std::fstream ofile; 
    std::ostream iout; 
    static OutputData *odata; 
    OutputData(const char* path):iout(std::cout), ofile(path) { 
     if (ofile.is_open()) { 
      iout = ofile; 
     } 
    } 
public: 
    static void print(std::string s) { 
     iout << s; 
    } 
}; 

в .cpp

OutputData *OutputData::odata = nullptr; 

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

благодарит

+1

Почему вы хотите использовать синглтон для этого, вместо того, чтобы просто предоставлять поток 'operator <<()' перегрузка для 'OutputData' ?? –

+0

, потому что у меня есть дюжина классов в моем проекте, которые должны использовать этот поток. – itorra

+0

. Вы не поняли, что я говорю: передайте его как ссылку вместо использования синглета, все остальное излишне загромождает ваш дизайн (особенно с большим иерархия классов). –

ответ

0

Вы не можете принимать любые std::istream или std::ostream экземпляр по копии, ваши переменные-члены должны быть ссылки или указатели:

class OutputData { 
    std::fstream* ofile; 
    std::ostream* iout; 
    static OutputData *odata; 
    OutputData(const char* path):iout(nullptr), ofile(nullptr) { 
     ofile = new fstream(path); 
     if (ofile->is_open()) { 
      iout = ofile; 
     } 
     else { 
      delete ofile; 
      ofile = nullptr; 
      iout = &cout; 
     } 
    } 
    // Take care to provide an appropriate destructor 
    ~OutputData() { 
     delete ofile; 
    } 

}; 

Также относительно вашего одноплодной дизайн, я бы скорее рекомендуют одиночную идиому Скотта Мейера:

class OutputData { 
public: 
    static OutputData& instance(const char* path) { 
     static OutputData theInstance(path) 
     return theInstance; 
    } 
    // Make print a non-static member function 
    void print(std::string s) { 
     iout << s; 
    } 
}; 

Хотя этот подход просто странно выглядит как противоположное, как то, что считается каноническим решением.

+0

и как его начать, скажем, с помощью argv из основного? – itorra

+0

@itorra Я серьезно сомневаюсь, вы действительно хотите синглтон. –

+0

Почему бы мне не пойти? что еще одно классическое решение вместо того, чтобы начать передачу объекта OutputData по всему проекту? – itorra