2016-02-20 3 views
-1

Когда я создаю и запускаю этот код в Eclipse CDT, я ожидаю, что он напечатает 1. Вместо этого он печатает -1992206527. Почему это?Почему cout дает мне неправильное целое число?

Вот мой код.

хиджры

#ifndef A_H 
#define A_H 

class A { 
private: 
    int a; 
public: 
    A(); 
    ~A(); 

    void printNum(); 
}; 

#endif 

a.cpp

#include <iostream> 
#include "A.h" 

A::A() : 
    a(1) 
{ 

} 

A::~A(){} 

void A::printNum(){ 
    std::cout << a << std::endl; 
} 

B.h

#ifndef B_H_ 
#define B_H_ 

class A; 

class B { 
private: 
    A* obj; 
public: 
    B(); 
    ~B(); 

    int run(); 
}; 

#endif 

B.cpp

#include "A.h" 
#include "B.h" 

B::B() {} 

B::~B() {} 

int B::run(){ 
    obj->printNum(); 
    return 0; 
} 

main.cpp

#include "B.h" 

int main(int argc, char **argv) { 
    B b; 
    return b.run(); 
} 
+2

Вы не инициализировали 'B :: obj'. – juanchopanza

+0

... и почему вы хотите, чтобы он был указателем? – LogicStuff

+0

@juanchopanza Как мне это сделать? – Username

ответ

1

Чтобы сделать печать 1, вы должны инициализировать B :: obj. Ниже приведена B.cpp с правильной инициализацией/освобождением obj.

#include "A.h" 
#include "B.h" 

B::B() : obj(new A) {} 

B::~B() { delete obj;} 

int B::run(){ 
    obj->printNum(); 
    return 0; 
} 

В качестве альтернативы, вы можете сделать OBJ быть типом объекта A (т.е. объявить OBJ, как A obj;), вместо того, чтобы сделать это указатель на объект типа А. Это было бы потребовать, включая A.h в B.h.

+0

Спасибо, я думаю, что я буду придерживаться в том числе 'A.h' в' B.h' для простоты – Username

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