почему следующий код компилируется нормально, но при использовании статического соединения возникает ошибка - PullRequest
0 голосов
/ 09 марта 2012

Следующий код компилируется нормально. но когда идет ссылка,

показывает следующую ошибку

Undefined symbols for architecture x86_64:
    "derived::counter", referenced from:
     derived::getAddressCounter()      in main.cpp.o 
     ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Я подозреваю, что что-то не так со статикой. но не уверен почему. Потому что, как только я снимаю статические, код ссылки нормально. Но как static играет какую-либо роль в этом коде?

#include <iostream>
#include <string>

struct base_result { };
struct result : public base_result {
    int a;
    std::string b;
};


struct base {
    static base_result counter;

};

struct derived: public base {
    static result counter;

    result * getAddressCounter(){
        counter.a = 10; 
        counter.b = "haha";
        return &counter;
    }   
 };

int main (){ 
    derived d;
    result * ptr;

    ptr = d.getAddressCounter();

    ptr->a = 20; 
    ptr->b = "baba";
    std::cout << ptr->a << std::endl;

    std::cout << ptr->b << std::endl;
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 09 марта 2012
struct base 
{ 
     static base_result counter; 
}; 

Только объявляет статический член. Вам также необходимо определить один раз в вашем файле cpp.

Хорошее чтение: Что такоеразница между определением и декларацией?

1 голос
/ 09 марта 2012

В отличие от переменных-членов, которые получают зарезервированное пространство в каждом созданном объекте, статические переменные не могут быть просто объявлены, они должны быть реализованы / определены тоже.

Просто добавьтестроки

base_result base::counter;
result derived::counter;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...