2010-05-01 2 views
1

У меня есть основную функцию в A.cpp, который имеет следующие соответствующие две строки кода:C++ область видимости функции

B definition(input_file); 
definition.Print(); 

In B.h у меня есть следующие соответствующие строки кода:

class B 
{ 
    public: 
    // Constructors 
    B(void);              
    B(const char *filename); 
    ~B(void); 

    // File input 
    int ParseLSFile(const char *filename); 

    // Debugging 
    void Print(void); 

    // Data 
    int var1; 
    double var2; 
    vector<char* > var3; 
    map<char*, vector<char* > > var4; 
} 

In B.cpp , У меня есть следующие сигнатуры функций (извините за избыточность):

B::B(void) 
    : var1(-1), 
    var2(numeric_limits<double>::infinity()) 
{ 
} 

B::B(const char *filename) 
{ 
    B *def = new B(); 
    def->ParseLSFile(filename); 
} 

B::~B(void) 
{ 
    // Free memory for var3 and var 4 
} 

int B::ParseLSFile(const char *filename) 
{ 
    // assign var1, var2, var3, and var4 values 
} 

void B::Print(void) 
{ 
    // print contents of var1, var2, var3, and var4 to stdout 
} 

Поэтому, когда я вызываю Print() с B::ParseLSFile(...), содержимое моих структур правильно печатается в стандартный вывод. Однако, когда я вызываю definition.Print() из A.cpp, мои структуры пусты или содержат мусор. Может ли кто-нибудь рекомендовать правильный способ инициализации/передачи моих структур, чтобы я мог получить к ним доступ за пределами области определения моей функции?

Спасибо.

+1

Везде, где в вашем коде есть символ char *, вы должны действительно рассмотреть использование std :: string - особенно для карты. – 2010-05-01 15:30:55

ответ

3

Вместо того, чтобы

B *def = new B(); 
def->ParseLSFile(filename); 

в конструкторе вы должны просто написать

ParseLSFile(filename); 

Это означает, что нынешние члены вашего объекта будут инициализированы с помощью ParseLSFile функции. Вероятно, вы можете назвать эту функцию InitFromFile, чтобы сохранить некоторую логику именования.

Тогда ваш код будет преобразовать в:

B object_name(filename); 
object_name.Print(); 

и (не точно, но только для вас, чтобы понять основные механики) это будет означать Somthing как

Create empty object of type B 
Initialize it from file using InitFromFile() 
Call Print() to display the contents of this object 
+0

Спасибо за предложение имени функции. Я думал о лучшем способе назвать это, и мне нравится ваш. – Myx

2

В конструкторе, который принимает a const char*, вы динамически создаете другой экземпляр класса и используете его вместо текущего экземпляра. Вместо

B *def = new B(); 
def->ParseLSFile(filename); 

вам нужно просто позвонить

ParseLSFile(filename); 

так, что вы работаете на объекте строится. Как и сейчас, у вас есть утечка ресурсов.

На несвязанной ноте вы не должны использовать указатель в качестве ключа карты. Как и сейчас, почти невозможно получить доступ к элементу по его ключу, потому что будет выполнено только сравнение указателей; значения строк, на которые указывает char*, не будут сравниваться. Вместо этого вы должны использовать std::string.

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