-4

Я знаю, что это довольно серьезное нарушение, но что это?Что не так в следующем фрагменте?

class xyz 
{ 
    void function1() 
    { 
     cout<<"in class"; 
    } 
}; 

int main() 
{ 
    xyz s1 = new xyz(100); 
    xyz s2 = s1; 
    s2.function1(); 
    delete s1; 
    return 0; 
} 

Что-то не так в распределении памяти, используя new. Я верю, но я не могу понять, что это за фундаменталь и резолюция.

+0

Вы забываете звезду '*' в определении типа. – Rakete1111

+0

Выполняет ли это компиляцию –

+0

Где находится конструктор, который принимает целое число –

ответ

2

new возвращает указатель (xyz *) на объект, а не объект, так что вы должны исправить тип s1:

xyz* s1=new xyz(100); 

и вызвать метод через указатель, вы должны использовать оператор ->:

s1->function1(); 

, который является эквивалентом разыменования указателя и вызова метода на объекте:

(*s1).function1(); 
+0

«И вы можете» должно быть «И у вас есть» – Rakete1111

+0

@ Rakete1111, ну или вы можете назвать его с помощью (* s1) .function(); но да, перефразировали, чтобы удалить возможную двусмысленность, thx :) –

4

Вы не можете назначить T*T (патологические случаи в стороне).

xyz * s1 = new xyz(); 
xyz * s2 = s1; 
s2->function1(); 
delete s1; 
return 0; 

еще лучше, не использовать голый new и delete и использовать смарт-указатель:

auto s1 = make_unique<xyz>(); 
xyz * s2 = s1.get(); // non-owning pointer 
s2->function1(); 
// no explicit delete necessary 
+0

Что такое «патологические» случаи? – Rakete1111

+0

Определяющий конструктор класса 'T' из' T * '. Я видел такое в производственном коде :( – krzaq

+0

Вау, я бы никогда об этом не думал :) – Rakete1111