Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для denis_32
3 / 3 / 2
Регистрация: 02.08.2014
Сообщений: 60

Конструктор с параметрами

23.05.2015, 14:23. Показов 1227. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!

Суть вопроса вот в чем:
Есть класс Game, в котором создаю объект с параметрами. Параметры я пытаюсь передать через класс-наследник, классу-родителю.

Но беда в том, что ошибку пишет на стадии создания объекта HumanPlayer user(table);

Подчеркивает table и пишет мол "Член Game::table не является именем типа".

C++
1
2
3
4
5
6
class Game
{
    Table table; //Стол
    HumanPlayer user(table); //Человек-игрок, как параметр даем ему стол, за которым он сидит
...
}
C++
1
2
3
4
5
6
class HumanPlayer : public Player  //Класс-наследник
{
    //конструктор класса-родителя
    HumanPlayer(Table &_table): Player(_table) {}
...
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Player //Класс-родитель
{
private:
    Table table;
 
public:
    Player()  {
    }
 
    Player(Table &_table)
    {
        table = _table;
    }
...
}

Очень прошу помощи, не понимаю в чем проблема.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.05.2015, 14:23
Ответы с готовыми решениями:

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Конструктор с параметрами
Забыл как выводить конструктор с параметрами, пробую так не выходит. #include <iostream> using namespace std; class...

Конструктор с параметрами
Не получается конструктор с параметром.. помогите пожалуйста! вот весь класс, нужно чтобы можно было в main писать вот так например: ...

5
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
23.05.2015, 14:28
Лучший ответ Сообщение было отмечено denis_32 как решение

Решение

Цитата Сообщение от denis_32 Посмотреть сообщение
Но беда в том, что ошибку пишет на стадии создания объекта HumanPlayer user(table);
Подчеркивает table и пишет мол "Член Game::Table не является именем типа".
Очень прошу помощи, не понимаю в чем проблема.
Инициализация должна быть инициализацией везде
В первом коде должен быть конструктор, который проинициализирует user. Ты же проинициализировал базовый класс Player. Точно так же нужно сделать везде:
C++
1
2
3
4
5
6
7
8
class Game
{
    Table table; //Стол
    HumanPlayer user; //Человек-игрок, как параметр даем ему стол, за которым он сидит
...
public:
    Game() : table(), user(table) {} // инициализация
};
C++
1
2
3
4
5
6
class HumanPlayer : public Player  //Класс-наследник
{
        //вызываем конструктор класса-родителя, передав ему параметр
    HumanPlayer(Table &_table): Player(_table) {} // инициализация
...
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Player //Класс-родитель
{
private:
    Table table;
 
public:
    Player()  {
    }
 
    Player(Table &_table) : table(_table) // инициализация
    { }
...
};
1
 Аватар для denis_32
3 / 3 / 2
Регистрация: 02.08.2014
Сообщений: 60
23.05.2015, 14:44  [ТС]
DrOffset, то есть, если я в классе Game буду создавать объекты других классов, я должен делать соответствующую запись в конструктор класса Game?

Например для этой записи:
C++
1
2
3
4
5
6
7
8
9
10
class Game
{
private:
    Deck deck;//Колода карт
    Table table;//Стол
 
    HumanPlayer user;//Человек-игрок
    ComputerPlayer computer;//Компьютер-игрок
..
}
Я должен сделать так?

public:
Game(): table(), user(table), computer(table), deck() {}


А потом в классе Deck добавлять в его конструктор инициализацию Game'a ?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
23.05.2015, 14:56
Лучший ответ Сообщение было отмечено denis_32 как решение

Решение

Цитата Сообщение от denis_32 Посмотреть сообщение
я должен делать соответствующую запись в конструктор класса Game?
denis_32, для конструкторов без параметров можно не писать явно. Т.е.
C++
1
Game(): /*table(),*/ user(table), computer(table) /*,deck()*/ {}
Вызов констукторов без параметров произойдет автоматически. Но вообще да.
В С++11 появилось некоторое упрощение, можно писать так:
C++
1
2
3
4
5
6
7
8
9
10
class Game
{
private:
    Deck deck;//Колода карт
    Table table;//Стол
 
    HumanPlayer user = table;//Человек-игрок
    ComputerPlayer computer = table;//Компьютер-игрок
..
}
Но если значение для инициализации приходит параметром конструктора, то инициализацию в конструкторе все равно писать нужно.
1
 Аватар для denis_32
3 / 3 / 2
Регистрация: 02.08.2014
Сообщений: 60
23.05.2015, 16:38  [ТС]
DrOffset, огромное спасибо, наконец-то разобрался. ))

Добавлено через 1 час 39 минут
DrOffset, еще один вопросик, немного не по теме.

Хочу в инициализации класса Game, передать конструкторам других классов, указатель на объект класса Game, как мне следует это сделать? Указателем this ?

C++
1
2
3
4
5
Game(): table(), user(table, this), computer(table, this) 
    {
        lastAction = ACTION_NONE;
        dealNextCards = false; //Раздать следующую партию карт когда совпали действия игроков
    }
такой код выдает ошибку "warning C4355: this: использован в списке инициализации базового класса"
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
23.05.2015, 17:01
Цитата Сообщение от denis_32 Посмотреть сообщение
как мне следует это сделать? Указателем this ?
Да. Только с этим нужно быть осторожным, в конструкторе объект считается еще не полностью сконструированным, поэтому обращаться к полям Game из конструктора User не стоит. Либо делать это с большой осторожностью, поля, к которым можно так обращаться, должны быть сконструированы ДО вызова конструктора User.
Вот такой код работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Game;
 
class Table
{
public:
    Table() {}
};
 
class User
{
public:
    User(Table & table, Game * game) {}
};
 
class Computer
{
public:
    Computer(Table & table, Game * game) {}
};
 
class Game
{
public:
    Game() : table(), user(table, this), computer(table, this)
    {
        //......
    }
private:
    Table table;
    User user;
    Computer computer;
};
Цитата Сообщение от denis_32 Посмотреть сообщение
"warning C4355: this: использован в списке инициализации базового класса"
Это не ошибка, а предупреждение. Как раз на тему того, что я выше написал.
Но похоже этот warning не из этого кода, который ты привел. Базовых классов тут нет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2015, 17:01
Помогаю со студенческими работами здесь

Не отображается конструктор с параметрами
// рншр.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> ...

Конструктор с параметрами по умолчанию
пытаюсь создать класс с параметрами по умолчанию(я да, надеюсь, что я не путаюсь в терминах) #include <iostream> class...

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

Классы и конструктор по умолчанию/с параметрами
Помогите пожалуйста! Необходимо сконструировать класс с заданным набором свойств. В данном случае, касс содержит следующие поля: продукт,...

Как реализовать конструктор с параметрами?
#include <locale.h> #include <iomanip> using namespace std; class Human { protected: char *surname; char *name; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru