что альтернатива set object = null в C ++, как C # - PullRequest
1 голос
/ 12 июля 2011

У меня есть функция что-то вроде:

MyClass1 mc1, mc0; //Single Object
MyClass2 mc2; //vector of MyClass1

mc1.Init(1);
mc2.Add(mc1);
mc1 = mc0;

mc1.Init(2);
mc2.Add(mc1);
mc1 = mc0;
//so on......

На самом деле я хочу установить mc1 = null в начале шага, но не могу этого сделать в C ++. Поэтому я сохранил никогда не инициализированный mc0, чтобы сделать это. Не думайте, что это элегантное решение. Мой опыт был в основном о C # и ASP.NET, которыми управляют (я думаю, что атрибут unmanaged в C ++ является причиной, почему я не могу сделать object = null. Верно?)

Ответы [ 7 ]

7 голосов
/ 12 июля 2011

Это не имеет никакого отношения к тому, управляется ли язык или нет, а скорее к другому подходу C ++ к ссылкам на объекты.В C # объявление MyClass mc; создаст переменную, которая может ссылаться на MyClass или быть null.В C ++ MyClass mc; создает переменную, которая равна a MyClass - экземпляр объекта целиком содержится в переменной, и поэтому переменная не может быть null.Если вам нужна ссылка, вы обычно используете указатель : MyClass * mc = NULL; или MyClass * mc = new MyClass();.

1 голос
/ 12 июля 2011

Вы не делаете это таким образом в C ++.Чтобы добавить объекты в вектор, вы делаете

std::vector<MyClass1>   mc2;

mc2.push_back(MyClass1(1));
mc2.push_back(MyClass1(2));

Нет необходимости создавать промежуточные ссылки или освобождать их.

1 голос
/ 12 июля 2011

Как и все остальные здесь, в C ++ вы не можете и не можете просто присвоить null экземпляру объекта.Однако вы можете присвоить NULL указатель на объект.В VS 2010, используя компилятор VC 10.0, вы можете заменить NULL на nullptr.Компилятор VC 10.0 немного более строг в отношении использования обоих.В любом случае, это не то, что вам нужно здесь.В вашем случае у вас должен быть вызов mc1 какого-то метода, который вернет его в известное предопределенное состояние.

Примечание: я так понимаю, вы пытаетесь избежать реконструкции объектов MyClass1?Если вы используете std :: vector и «добавляете» эти экземпляры в, то объекты копируются заново, так как vector берет копии того, что помещено в него.Если вы хотите еще больше ускорить процесс, вы можете сохранить вектор указателей на экземпляры ваших объектов.Но это совершенно новая игра в мяч и имеет и другие последствия.

1 голос
/ 12 июля 2011

MyClass *mc1 является указателем на ваш класс и может быть назначен 0

MyClass mc1 является экземпляром вашего класса, и так как вы не перегружали оператор = с помощью int, вы можете 't присваивает ему 0

В C # есть только указатели на классы, поэтому эквивалент C MyClass mc1 в C ++ равен MyClass *mc1

1 голос
/ 12 июля 2011

Как насчет этого:

mc1 = MyClass();

это предполагает, что MyClass имеет конструктор по умолчанию.

0 голосов
/ 12 июля 2011

В C ++ MyClass1 mc1 фактически создает объект mc1 типа MyClass1. Если вы хотите, чтобы переменная изначально имела нулевое значение, то вы должны сделать mc1 указателем типа MyClass1, а не object. Вот простой пример, чтобы показать вам (не забывайте, что вы будете нести ответственность за очистку объекта с помощью delete)

MyClass* mc1 = null;
....
mc1 = new MyClass();
mc1->Init(1);
mc2.Add(*mc1); 
// if you are adding object, if your vector hold pointer, then it will be 
// mc2.Add(mc1);
.......
mc1 = null;
0 голосов
/ 12 июля 2011

В C ++ не существует способа установить объект в NULL - с другой стороны, вы можете установить указатели в NULL. В зависимости от цели разработки вам может потребоваться либо: а) начать работать с указателями, либо б) вызвать mc1.Init(0); (при условии, что 0 означает то, что вы подразумеваете под NULL).

РЕДАКТИРОВАТЬ: другой ответ предлагает вызвать mc1 = MyClass();, который также является жизнеспособным вариантом, если вам все равно, какое значение содержится в mc1 (или вы знаете, что конструктор по умолчанию собирается инициализировать переменные таким образом, чтобы иметь переменная по умолчанию является приемлемой заменой NULL

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