a.h
#ifndef A_H_INCLUDED
#define A_H_INCLUDED
namespace N
{
static int x;
void setX();
int getX();
}
#endif // A_H_INCLUDED
#include "a.h"
void N::setX()
{
x=25;
}
int N::getX()
{
return x;
}
#include <iostream>
#include "a.h"
int main()
{
N::x=300;
N::setX();
std::cout << N::x << N::getX()<<std::endl;
return 0;
}
1. Потому что x это глобальная переменная и она должна быть определена заранее.
int main()
{
int N::x=300;
N::setX();
std::cout << N::x << N::getX()<<std::endl;
return 0;
}
потому что int x - это объявление переменной. а предварительная декларация - это extern int x.
переменные (не статические) нельзя объявлять в заголовочниках в принципе.
И даже более того - даже если эту переменную объявить в хидере как статическую, в каждую единицу компиляции будет включен свой экземпляр переменной. Какие любопытные эффекты могут возникнуть оттого, что программист думает, что обращается к глобальной переменной x, а на самом деле обращается только к экземпляру, существующему только в данной единице компиляции -
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)