Вопрос по с++

laptew

Я хочу сделать в проге переменную типа vector внешней. vector - название класса. При запуске программы получаю ошибку "error LNK2001: unresolved external symbol "class vector * v" (?@@A)". В аналогичных случаях с переменными других типов, например, double, требуется просто инициализировать внешнюю переменную при объявлении, чтобы не выдавалось сообщение об ошибке. Но как инициализировать при объявлении переменную типа созданного класса?
Вот код
  class vector
{
public:
double x[N];

vector operator +(vector);
vector operator -(vector);
vector operator *(double);
double operator *(vector);
vector
{
int s;
float fi,psi,teta;
x[0]=0;
x[1]=0;
x[2]=0;
x[3]=0;
x[4]=0;
x[5]=0;
fi=x[3];
psi=x[4];
teta=x[5];
for(s=0;s<S;s++)//radial intitialization
{
x[6+3*s]=-lambda0*cos(2*PI*s/(float)S)*(cos(psi)*cos(fi)-cos(teta)
*sin(fi)*sin(psi-lambda0*sin(2*PI*s/(float)S)*(sin(psi)*cos(fi)+cos(teta)*sin(fi)*cos(psi;
x[7+3*s]=-lambda0*cos(2*PI*s/(float)S)*(cos(psi)*sin(fi)+cos(teta)
*cos(fi)*sin(psi-lambda0*sin(2*PI*s/(float)S)*(sin(psi)*sin(fi)-cos(teta)*cos(fi)*cos(psi;
x[8+3*s]=-lambda0*cos(2*PI*s/(float)S)*sin(psi)*sin(teta)+lambda0
*sin(2*PI*s/(float)S)*cos(psi)*sin(teta);
}
//x[8+3]=x[8+3]+2;
};
};


vector vector::operator+(vector z)
{
vector u;
int i;
for(i=0;i<=N-1;++i)
{
u.x[i]=x[i]+z.x[i];
}
return u;
};
vector vector::operator-(vector z)
{
vector u;
int i;
for(i=0;i<=N-1;++i)
{
u.x[i]=x[i]-z.x[i];
}
return u;
};
vector vector::operator*(double z)
{
vector u;
int i;
for(i=0;i<=N-1;++i)
{
u.x[i]=z*x[i];
}
return u;
};
double vector::operator*(vector z)
{
double u=0.0;
int i;
for(i=0;i<=N-1;++i)
{
u=u+x[i]*(z.x[i]);
}
return u;
};

extern vector v[M];

void GenerateVP
{
...
}

main
{
...
}

tamusyav

Ошибка возникает из-за того, что переменная v объявлена, но не описана (см. справку по ключевому слову extern).
Инициализация объекта (переменной типа класса) - это вызов конструктора, причем если это массив из N объектов, то для каждого из них будет вызван свой конструктор, то есть будет N вызовов конструктора. Если параметры конструктора не указаны, то будет вызван конструктор по умолчанию (без параметров).
В аналогичных случаях с переменными других типов, например, double, требуется просто инициализировать внешнюю переменную при объявлении, чтобы не выдавалось сообщение об ошибке.
Не путай описание с объявлением. Все переменные инициализируются в описании (кроме тех, которые не инициализируются вообще). Объекты инициализируются всегда, то есть независимо от наличия явного вызова конструктора инициализация будет выполнена.
Вообще-то программа написана, скажем так, с некоторыми огрехами. Не то чтобы критичными, на результат, может быть, даже не влияющими, но грабли (потенциально) есть.

Missi4ka

Если нужно, чтобы массив был доступен вне функции main, создай лучше динамический маасив и инициализируй его в main операцией new.

Oper

чем лучше ? если размер массива фиксирован.
ты имхо не прав.

pitrik2

у тебя монитор большой, да?
фигли так текст "разъездил"?

laptew

спасибо!
Оставить комментарий
Имя или ник:
Комментарий: