Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

работа с указателями

Hello comp,

объявляю собственный тип данных

typedef CArray < Act, Act > Acti;

Act - структура. Потом в классе делаю экземпляры этого типа

Acti myAct;
Acti myAct2;

В некоторых случаях в функцию

BOOL Load(Acti& curRecAct)

передаю myAct, в некоторых myAct2. Работает нормально. Но если сделать в классе
объявление
Acti& tmpAct; и попытаться присвоить этому tmpAct=myAct, компилятор ругается,
подстановка
амперсанда в разные места ничего не дает. Что делать?

Ответить   Thu, 31 May 2007 13:42:17 +0400 (#669353)

 

Ответы:

Deni_S пишет:

Правильно ругается, т.к. у класса CArray не перегружен
CArray<X, X>& operator = (CArray<X, X>&)

Ответить   Thu, 31 May 2007 14:53:21 +0300 (#669470)

 

Hello Zeram,

Thursday, May 31, 2007, 3:53:21 PM, you wrote:

Теперь компилятор ругается по другому.

template<class TYPE, class ARG_TYPE>
class CMyArray : public CArray< Act, Act >
{
public:
CArray <Act, Act>& operator = (CArray <Act, Act>&);
};

typedef CMyArray < Act, Act > Acti;

struct CSetPtrRec{
CSetPtrRec();
Acti& tmpRec;
CMyUIntArray& arCoorMous;
}

А компилятор в ответ: error C2758: 'tmpRec' : must be initialized in constructor
base/member initializer list
see declaration of 'tmpRec'
и указывает на конструктор
CSetPtrRec::CSetPtrRec()
{
}

Ответить   Thu, 31 May 2007 22:33:33 +0400 (#669534)

 

Здравствуйте !

Угу. Правильно ругается.
Ссылка tmpRec не инициализирована.
Надо инитить ее в конструкторе.

З.Ы. попробуйте сделать:
int &rnSomeRef;
тоже ругнется.
А
int n;
int &rnSomeRef = n;
не ругнется.

Ответить   Fri, 1 Jun 2007 20:46:36 +0400 (#669925)

 

Hello Victor,

Friday, June 1, 2007, 8:46:36 PM, you wrote:

К сожалению, в конструкторе инитить не удается. Та же ошибка выдается.

*.h file
struct CSetPtrRec{
CSetPtrRec();
int &rnSomeRef;
};

*.cpp file
int i_var;
CSetPtrRec::CSetPtrRec()
{
rnSomeRef=i_var;
}

Compiling...
error C2758: 'rnSomeRef' : must be initialized in constructor base/member initializer
list
*.h(32) : see declaration of 'rnSomeRef'

Что за зверь этот - constructor base/member initializer list?

Ответить   Sat, 2 Jun 2007 17:02:33 +0400 (#670077)

 

*.h file
struct CSetPtrRec{
CSetPtrRec();
int &rnSomeRef;
};

*.cpp file
int i_var;
CSetPtrRec::CSetPtrRec(): rnSomeRef(i_var)
{
}

Ответить   Sat, 02 Jun 2007 19:12:20 +0600 (#670079)

 

Hello Юрчик,

Saturday, June 2, 2007, 5:12:20 PM, you wrote:

Похоже, то что нужно. Только жаль так нельзя

CSetPtrRec::CSetPtrRec(int i_var): rnSomeRef(i_var)
{
}
Тогд компилятор говорит, мол error C2512: 'CSetPtrRec' : no appropriate default
constructor available

В принципе устраивает и Ваш вариант, только в *.cpp приходится временно
использовать левую переменную i_var. Немного некрасиво.

Ответить   Sun, 3 Jun 2007 13:52:30 +0400 (#670316)

 

Похоже, что для CSetPtrRec требуется конструктор по-умолчанию, т.е. без
параметров. Придется его определить, но чем в таком случае
инициализировать ссылку rnSomeRef - решайте сами :-)

Deni_S wrote:

Ответить   Mon, 04 Jun 2007 00:56:37 +0600 (#670503)

 

Hello Юрчик,

Sunday, June 3, 2007, 10:56:37 PM, you wrote:

Обошлось без конструктора по умолчанию- надо было проинициализировать экземпляр
CSetPtrRec
также через двоеточие в классе в котором этот экземпляр используется. В результате
все
получилось весьма изящно, как и хотелось. Так что всем спасибо. В частности
Zeram за то,
что подсказал как правильно перегрузить оператор.

Ответить   Mon, 4 Jun 2007 21:55:09 +0400 (#670817)

 

Hi!

Take a look at this code , I think , it will help you:

#include "stdafx.h"
#include <map>

struct My_Struct
{
int a;
int b;
} str;

typedef std::map <My_Struct , My_Struct> Acti;

bool Load(Acti& curRecAct)
{
return true;
}

class myClass
{
public:
void Temp(Acti& myAct);
};

int _tmain(int argc, _TCHAR* argv[])
{
Acti myAct;
Acti myAct2;

Load(myAct2);

Acti& tmpAct = myAct;

myClass cls;

cls.Temp(tmpAct);

return 0;
}

void myClass::Temp(Acti& myAct)
{
Acti& tmpAct = myAct;

}

On my comp , everything works fine.

Best regards,
Vitaliy Kulyck
Software developer
SoftServe, Inc.
52 V. Velykoho St., Lviv 79053, Ukraine
Tel: +380 32 2409999 Int. 1310
Fax: +380 32 2409080
vkuly***@s*****.com
www.softservecom.com
This email may contain confidential and privileged material for the sole use
of the intended recipient. Any review or distribution by others is strictly prohibited.
If you are not the intended recipient please contact the sender and delete all
copies.



-----Original MessageFrom: Deni_S [mailto:dens***@n*****.ru]
Sent: Thursday, May 31, 2007 12:42 PM
To: Vitaliy Kulyck

Hello comp,

объявляю собственный тип данных

typedef CArray < Act, Act > Acti;

Act - структура. Потом в классе делаю экземпляры этого типа

Acti myAct;
Acti myAct2;

В некоторых случаях в функцию

BOOL Load(Acti& curRecAct)

передаю myAct, в некоторых myAct2. Работает нормально. Но если сделать в классе
объявление
Acti& tmpAct; и попытаться присвоить этому tmpAct=myAct, компилятор ругается,
подстановка
амперсанда в разные места ничего не дает. Что делать?

Ответить   Thu, 31 May 2007 13:31:00 +0300 (#669471)