#c
#c
Вопрос:
class a
{
private:
b *b_obj;
public:
void set(int);
};
a::a()
{
b_obj = new b;
}
a::set(int s)
{
b_obj->c = s;
}
class b
{
public:
int c;
};
допустим ли этот код?
если нет, как мне сделать b_obj определенного объекта (скажем, a_obj) класса a, изменяемого в другом классе c … если a_obj я создал в другом классе d …. я боюсь, что a_obj выйдет за рамки класса c.
надеюсь, вы поняли мой вопрос. большое спасибо, что нашли время, чтобы прочитать мой пост
Комментарии:
1. Возможно, один конкретный вопрос за раз вместе с последовательным небольшим примером кода будет способствовать лучшим ответам…
2. Голосование за закрытие как «Не настоящий вопрос». @CAD_Coding, выкристаллизовывайте свои мысли до тех пор, пока у вас не появятся подробные и конкретные отдельные вопросы, затем задайте эти вопросы или просто задайте свой вопрос «наконец». Надеюсь, это поможет.
3. @BinaryWorrier можете ли вы, пожалуйста, ответить на мой «наконец» вопрос?
4. Согласен с close. Где-то здесь есть вопрос, я просто не могу его найти.
5. Если вы можете сузить это до одного вопроса, на который можно ответить, я был бы рад снова открыть его для вас.
Ответ №1:
Код почти корректен. class b
необходимо объявить (или, по крайней мере, объявить вперед), прежде чем на него ссылаются class a
, вы не указываете возвращаемый тип в определении для a::set
, и вы не предоставили объявление для a
конструктора по умолчанию. Вот пересмотренный код вместе с тестовым жгутом:
class b
{
public:
int c;
};
class a
{
private:
b *b_obj;
public:
a();
void set(int);
};
a::a()
{
b_obj = new b;
}
void a::set(int s)
{
b_obj->c = s;
}
int main()
{
a my_a;
my_a.set(42);
}
Теперь, только потому, что код действителен, не означает, что он хорош:
- Вы не инициализируете
c
при построении по умолчаниюb
. - Вы используете необработанные указатели на dyanamically-allocated
b
‘ы. Используйте вместо этого автоматические переменные, когда это возможно. Среди причин этого есть … - Вы никогда
delete
b
new
a
не редактировали конструктор. Это приводит к утечке памяти. Если бы вы с самого начала избегали использования динамического распределения, это не было бы проблемой.
Комментарии:
1. большое спасибо!!!! 🙂 ваш тест — это именно то, что я хотел сказать еще 1 вещь, которую мне нужно спросить: в main() если я использую: printf(«n%d n», b_obj-> get());//get() возвращает c, я использую delete b_obj вдеструктор класса b … так будет ли приведенный выше printf печатать 42 или он выйдет за рамки?
2. Трудно сказать, не видя фактического кода, но если я понимаю, о чем вы спрашиваете, то да. Почему бы вам не попробовать это самостоятельно и не выяснить?
Ответ №2:
Ну,
*b_obj = *other_b_obj;// equality of objects values
b_obj = other_b_obj; // equality for pointer values
предполагая, что b_obj
это объект и other_b_obj
указатель:
b_obj = *other_b_obj;
Предполагая обратное:
b_obj = amp;other_b_obj;
Предполагая, что оба являются указателями:
b_obj = other_b_obj;
что касается вашего последнего вопроса, new
не является обязательным для указания указателей. Указатель может указывать на завершающий объект. Однако, если вы хотите, чтобы указатель указывал на новый объект, используйте new
ключевое слово then , которое пытается создать новый объект и возвращает новый адрес объекта.
Комментарии:
1. Все еще неверно. Насколько мы можем судить, нет ничего недопустимого,
*b_obj = *other_b_obk
кроме того, что это просто плохое кодирование.2. b_obj — это указатель на объект класса b. необходимо ли создавать объект класса b для использования b_obj? является ли other_b_obj допустимым? @JohnDibling
3. Этот ответ теперь не имеет никакого сходства с тем, что вы изначально сказали.
4. @CAD: не пытайтесь играть с системой. Потратьте некоторое время и усилия, пытаясь создать целостный вопрос, и я отвечу на это.
5. @JohnDibling теперь мой вопрос понятен? может быть, мой язык не так хорош … я очень сожалею об этом … но, пожалуйста, учтите, что я студент mech engg, и я слишком любознателен, чтобы изучать c под давлением mech engg!
Ответ №3:
допустим ли этот код?
Код почти корректен, за исключением того, что вы забыли указать возвращаемый тип функции set:
void a::set(int s)
Однако функция set действительно изменит c
член b_obj
. Это общедоступно, поэтому компилятор разрешит это.
Кстати, почему бы вам не попробовать самому?
Кроме того, пока вы изучаете, посмотрите на конструкторы, деструкторы, оператор присваивания и реализуйте их, чтобы b_obj
правильно освободить объект. Вы даже можете использовать a shared_ptr
для этого.
Кроме того, я бы не советовал вам использовать для класса такое скучное имя, как нижний регистр a
.
Комментарии:
1. спасибо за ссылку на ideone … я этого не знал … большое спасибо