Error only constructors take member initializers

  • Forum
  • Beginners
  • Only constructors take member intializer

Only constructors take member intializers

I’m working on a code for my Computer Science class and in this project we have to make a knight jousting game. But in the game we have to have two separate classes one for the knight and the other for the weapon. I have to use my weapon class in my knight class though and things just get really weird so I’ll post my code and the error I keep getting exactly from the compiler because I’m confused on what to do.

Weapon.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include"random.h"

using namespace std;

class Weapon
{
	public:
		void weaponStats(string type, int HitChance, int StaminaRequired);
	private:
		string Type;
		int Hit_Chance;
		int Stamina_Required;

};

Knight.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<string>
#include"weapon.h"

using namespace std;

class Knight
{
	public:
		void setKnightStats(string Knightname, int KnightStamina, string type, int HitChance, int StaminaRequired);
		void display();
	private:
		string KnightName;
		int Knight_Stamina;
		bool on_Horse;
		Weapon wield;


};

Knight.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include"Knight.h"
//#include"weapon.h"
#include<iostream>

using namespace std;

//Knight1 name
void Knight::setKnightStats(string Knightname, int KnightStamina, string type, int HitChance, int StaminaRequired)
: wield(type, HitChance, StaminaRequired)
{
	KnightName = Knightname;
	Knight_Stamina = KnightStamina;
	
}

void Knight::display()
{
	cout << KnightName << endl;
	cout << Knight_Stamina << endl;
}

p02.cpp //contains main

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<iostream>
#include"Knight.h"
//#include"weapon.h"

using namespace std;

int main()
{
	Knight k1;
	Knight k2;
	Weapon w1;
	Weapon w2;


	//Knight1 Code
	string KnightName;
	int Stamina;
	int HitChance;
	string type;
	int staminaRequired;

	cout << "Player 1, Enter your knights name: ";
	cin >> KnightName;
	cout << KnightName << " enter your stamina: ";
	cin >> Stamina;
	cout << "What weapon are you wielding: ";
	cin >> type;
	cout << "What's the " << type << "'s hit chance? ";
	cin >> HitChance;
	cout << "What's the " << type << "'s stamina required: ";
	cin >> staminaRequired;
	k1.setKnightStats(KnightName, Stamina, type, HitChance, staminaRequired);

	//Knight2 Code
	string KnightName2;
	int Stamina2;
	int HitChance2;
	string type2;
	int staminaRequired2;

	cout << "PLayer 2, Enter your knights name: ";
	cin >> KnightName2;
	cout << KnightName2 << " enter your stamina: ";
	cin >> Stamina2;
	cout << "What weapon are you wielding: ";
	cin >> type2;
	cout << "What's the " << type2 << "'s hit chance? ";
	cin >> HitChance2;
	cout << "What's the " << type2 << "'s stamina required: ";
	cin >> staminaRequired2;

	k2.setKnightStats(KnightName2, Stamina2, type2, HitChance2, staminaRequired2);
}

and the error I keep on getting is this

$ g++ p02.cpp knight.cpp
knight.cpp: In member function ‘void Knight::setKnightStats(std::string, int, std::string, int, int)’:
knight.cpp:9:3: error: only constructors take member initializers
: wield(type, HitChance, StaminaRequired)

Last edited on

wield is an instance of Weapon class. The weapon class has only the default constructor (no arguments). You need to define a constructor that takes a string and two ints

So make a weapon.cpp and define my constructor in there? kind of like this

1
2
3
4
5
6
7
8
9
10
11
#include"weapon.h"
#include<iostream>

using namespace std;

void Weapon::weaponStats(string type, int HitChance, int StaminaRequired)
{
	Type = type;
	Hit_Chance = HitChance;
	Stamina_Required = StaminaRequired;
}

weaponStats is not a constructor, a constructor has the same name as the class..

u need to make a constructor for weapon and another one for Knight then move the initializer there :

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
33
34
35
class Weapon
{
public :
    Weapon( string Type, int Hit_Chance, int Stamina_Required )
    // member initializer list :
    : Type( Type ),
      Hit_Chance( Hit_Chance ),
      Stamina_Required( Stamina_Required )
    { /* body */ }

    // ...
private :
    string Type;
    int Hit_Chance;
    int Stamina_Required;
};

class Knight
{
public :
    Knight( string Knightname, int KnightStamina, string Type, int HitChance, int StaminaRequired )
    // member initializer list
    : KnightName( Knigtname ),
      Knight_Stamina( KnightStamina ),
      on_horse( ... ),
      wield( Type, HitChance, StaminaRequired )
    { }
    
    // ...
private :
    string KnightName;
    int Knight_Stamina;
    bool on_Horse;
    Weapon wield;
};

Constructors are much better than member functions that «sets» or «initializes» members like setKnightStats()

Last edited on

Topic archived. No new replies allowed.

Hornet89

6 / 3 / 3

Регистрация: 02.03.2021

Сообщений: 27

1

Вывести таблицу значений функции и количество положительных и отрицательных значений

04.03.2021, 06:05. Показов 2123. Ответов 8

Метки нет (Все метки)


Как решить ошибки в коде?

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
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main(): {
  
    double x, xn = -3.2, xk = 3.2, z, a, b, n = 0, m = 0;
    
    for(x = xn; x <= (xk + 0.1); x += 0.2) {
        
        a = pow(x, 2) + 0.5;
        b = 1 - ((pow(x, 2) - 0,5) / 2);
        
        z = a / b;
        
        if (z > 0)
            n ++;
        else if (z < 0)
            m ++;
        else 
            continue;
        
    }
    
    cout << "Количество ситуаций, при которых соблюдается неравенство z>0: " << n;
    cout << "Количество ситуаций, при которых соблюдается неравенство z<0: " << m;
    
}

В коде присутствуют ошибки:

C++
1
2
3
4
5
main.cpp: In function ‘int main():
main.cpp:8:13: error: only constructors take member initializers
 int main(): {
             ^
main.cpp:8:13: error: expected identifier before ‘{’ token

Также я не знаю, как вывести значения x и y в два столбца.

Пожалуйста, помогите мне с этим заданием.
Заранее спасибо!

Миниатюры

Вывести таблицу значений функции и количество положительных и отрицательных значений
 

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



263 / 182 / 87

Регистрация: 03.05.2020

Сообщений: 790

04.03.2021, 06:20

2

Цитата
Сообщение от Hornet89
Посмотреть сообщение

int main(): {

убрать



0



6 / 3 / 3

Регистрация: 02.03.2021

Сообщений: 27

04.03.2021, 06:29

 [ТС]

3

Как вывести значения x и y в два столбца?



0



2438 / 1177 / 436

Регистрация: 08.11.2016

Сообщений: 3,251

04.03.2021, 09:24

4

Hornet89, выводить попарно по окончании каждой итерации цикла с переводом строки.



0



Эксперт CЭксперт С++

4259 / 2465 / 1334

Регистрация: 14.12.2018

Сообщений: 4,633

Записей в блоге: 1

04.03.2021, 10:01

5

Цитата
Сообщение от Hornet89
Посмотреть сообщение

int main(): {

Убирайте двоеточие в этой команде.



0



zss

Модератор

Эксперт С++

12641 / 10135 / 6102

Регистрация: 18.12.2011

Сообщений: 27,170

04.03.2021, 10:15

6

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
#include <iostream>
//#include <cmath>
#include <clocale>
using namespace std;
 
int main(){
 
    double xn = -3.2, xk = 3.2;
    int n = 0, m = 0;
 
    for(double x = xn; x < xk + 0.1; x += 0.2) 
    {
        double a = x * x + 0.5;
        double b = 1.0 - (x * x - 0.5) / 2.;
 
        double z = a / b;
        cout<<x<<'t'<<z<<endl;
        if (z > 0)
            n++;
        else if (z < 0)
            m++;
    }
    setlocale(LC_ALL,"Rus");
    cout << "Количество ситуаций, при которых соблюдается неравенство z>0: " << n<<endl;
    cout << "Количество ситуаций, при которых соблюдается неравенство z<0: " << m;
    cin.get();
    return 0;
}



0



Volga_

Эксперт CЭксперт С++

4259 / 2465 / 1334

Регистрация: 14.12.2018

Сообщений: 4,633

Записей в блоге: 1

04.03.2021, 10:24

7

Цитата
Сообщение от Hornet89
Посмотреть сообщение

Как вывести значения x и y в два столбца?

Я предлагаю вам код:

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
33
34
35
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
double zFunc(double x)
{
    double const eps = 1e-9;
    if (fabs(x * x - 2.5) > eps)
        return 2 * (x * x + 0.5) / (2.5 - x * x);
    else
        return 0;
}
 
int main()
{
    double xmin=-3.2, xmax=3.2, dx=0.2;
    int nPos = 0, nNe = 0;
    cout << "x" << setw(10) << "y" << endl;
    double x, z;
    for (x = xmin; x <= xmax + dx/2; x += dx)
    {
        z = zFunc(x);
        if (z > 0)
            nPos += 1;
        if (z < 0)
            nNe += 1;
        cout << fixed << setprecision(2) << x << setw(10) << fixed << setprecision(3) << z << endl;
    }
    cout << "Количество ситуаций, при которых соблюдается неравенство z>0: " << nPos << endl;
    cout << "Количество ситуаций, при которых соблюдается неравенство z<0: " << nNe << endl;
 
    system("pause");
    return 0;
}



0



Hornet89

6 / 3 / 3

Регистрация: 02.03.2021

Сообщений: 27

04.03.2021, 10:30

 [ТС]

8

Мне нужно сделать так, чтобы все значения обоих переменных находились друг под другом, как в самой обычной таблице.

Код программы:

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
33
34
35
36
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main() {
  
    double x, z, a, b, c, n = 0, m = 0;
    
    cout << "  x    zn";
    
    for(x = -3.2; x < 3.21; x += 0.2) {
        
        x = round(x * 10) / 10;
        
        a = x * x + 0.5;
        b = x * x - 0.5;
        c = 1 - b / 2;
        
        z = a / c;
        
        if (z > 0)
            n ++;
        else if (z < 0)
            m ++;
        else
            continue;
        
        cout << x << " " << z << "n";
        
    }
    
    cout << "Количество ситуаций, при которых соблюдается неравенство z>0: " << n << "n";
    cout << "Количество ситуаций, при которых соблюдается неравенство z<0: " << m;
    
}

Вывод:

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
33
34
  x    z
-3.2 -2.77519
-3 -2.92308
-2.8 -3.1236
-2.6 -3.40845
-2.4 -3.84049
-2.2 -4.5641
-2 -6
-1.8 -10.1081
-1.6 -102
-1.4 9.11111
-1.2 3.66038
-1 2
-0.8 1.22581
-0.6 0.803738
-0.4 0.564103
-0.2 0.439024
0 0.4
0.2 0.439024
0.4 0.564103
0.6 0.803738
0.8 1.22581
1 2
1.2 3.66038
1.4 9.11111
1.6 -102
1.8 -10.1081
2 -6
2.4 -3.84049
2.6 -3.40845
2.8 -3.1236
3 -2.92308
3.2 -2.77519
Количество ситуаций, при которых соблюдается неравенство z>0: 15Количество ситуаций, при которых соблюдается неравенство z<0: 18

Вывод, который должен быть:

C++
1
2
3
4
5
6
7
8
9
  x      z
-3.2 -2.77519
-3    -2.92308
-2.8 -3.1236
-2.6 -3.40845
-2.4 -3.84049
-2.2 -4.5641
-2    -6
и т. д.



0



zss

Модератор

Эксперт С++

12641 / 10135 / 6102

Регистрация: 18.12.2011

Сообщений: 27,170

04.03.2021, 10:33

9

Лучший ответ Сообщение было отмечено Hornet89 как решение

Решение

Hornet89, что-то Вы игнорируете то, что Вам пишут.

Можете просто

Цитата
Сообщение от Hornet89
Посмотреть сообщение

cout << x << » » << z << «n»;

заменить на

C++
1
cout << x << 't' << z << endl;

а лучше так, как написал Volga_

C++
1
        cout << fixed << setprecision(2) << x << setw(10) << fixed << setprecision(3) << z << endl;



2



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

04.03.2021, 10:33

9

Я купил исходный код плагина Ogre (Particle Universe), который (или должен был быть) написан на C++, независимом от платформы. Он поставляется с решением Visual Studio, которое прекрасно компилируется, но поскольку весь мой проект скомпилирован с помощью G++, я хочу скомпилировать эту библиотеку и с помощью G++. Но по какой-то причине объявление шаблона выдает ошибку в G++. Вот фрагмент кода.

typedef Ogre::Any Any;
template <typename ValueType> ValueType* any_cast(Any* operand) : public any_cast(operand){};

Может ли какой-нибудь гуру С++ сказать мне, почему появляется эта ошибка? (может быть другой синтаксис?)

include/ParticleUniverseAny.h: In function 'ValueType*
ParticleUniverse::any_cast(ParticleUniverse::Any*)':
include/ParticleUniverseAny.h:21:68: error: only constructors take member initializers
include/ParticleUniverseAny.h:21:68: error: expected identifier before 'public'
include/ParticleUniverseAny.h:21:68: error: expected '{' before 'public'
include/ParticleUniverseAny.h: At global scope:
include/ParticleUniverseAny.h:21:68: error: expected unqualified-id before 'public'

Буду рад и благодарен за любую помощь!

РЕДАКТИРОВАТЬ: any_cast определен в OgreAny.h

friend ValueType * any_cast(Any *);

template<typename ValueType>
ValueType * any_cast(Any * operand)
{
    return operand && operand->getType() == typeid(ValueType)
                ? &static_cast<Any::holder<ValueType> *>(operand->mContent)->held
                : 0;
}

template<typename ValueType>
ValueType * any_cast(Any * operand)
{
    return operand && operand->getType() == typeid(ValueType)
                ? &static_cast<Any::holder<ValueType> *>(operand->mContent)->held
                : 0;
}

template<typename ValueType>
const ValueType * any_cast(const Any * operand)
{
    return any_cast<ValueType>(const_cast<Any *>(operand));
}

template<typename ValueType>
ValueType any_cast(const Any & operand)
{
    const ValueType * result = any_cast<ValueType>(&operand);
    if(!result)
    {
        StringUtil::StrStreamType str;
        str << "Bad cast from type '" << operand.getType().name() << "' "
            << "to '" << typeid(ValueType).name() << "'";
        OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
            str.str(), 
            "Ogre::any_cast");
    }
    return *result;
}

Ошибка функции класса / члена

У меня есть этот фрагмент кода здесь:

class physics_vector
{ 
public:
    double direction, magnitude;
    int dir_mag(double dir, double mag) :direction(dir), 
        magnitude(dir) {return 0; };
};

int dir_mag(double dir, double mag)
{
    cout << "Direction: " << dir << 'n';
    cout << "Magnitude: " << mag << 'n';
    return 0;
}

Всякий раз, когда я пытаюсь скомпилировать, я получаю ошибку,

13:39: error: only constructors take member initializers

Любая помощь пожалуйста?

21 фев. 2014, в 06:27

Поделиться

Источник

Эта функция:

int dir_mag(double dir, double mag) :direction(dir), magnitude(dir)
{return 0; };

использует список инициализаторов (:direction(dir), magnitude(dir)) и допускает только конструкторы. Если бы вы планировали сделать это конструктором, ваш класс должен выглядеть следующим образом:

class physics_vector
{ 
public:
    double direction, magnitude;
    physics_vector(double dir, double mag) :direction(dir), 
        magnitude(dir) {};
};

И это скомпилируется. Обратите внимание, что вам не разрешено возвращать значение из конструктора, и у них нет возвращаемых типов.

Peter R
21 фев. 2014, в 06:29

Поделиться

Вы не можете использовать список инициализаций в функциях. Недействительная операция в С++. Список инициализаторов можно использовать только с конструктором.
Компилятор дает очень ясную ошибку.

HadeS
21 фев. 2014, в 08:02

Поделиться

Ещё вопросы

  • 0как отключить нг-повтор с помощью кнопки angularjs?
  • 1Как создать интерактивную кнопку с ShapeDrawable?
  • 1Gulp: Uglifying Bootstrap 4 js-файлов
  • 1Виджет приложения со списком
  • 0Использование angular.js для установки выбранного из динамического значения в файлах JSON
  • 0не могу добавить в базу данных MySQL
  • 0$ scope не обновляется
  • 0угловой $ scope. $ on не работает
  • 1Переключение между 3 функциями по щелчку мыши
  • 1Списки в списках
  • 1Автоэнкодер работает для MNIST, но сбой для изображений с большим размером
  • 0Модификация заголовков PHP
  • 1Как я могу заглушить хапи обработчик?
  • 0Ошибка параметра / аргумента карты (решение найдено)
  • 1Приложение не появляется в Маркете для некоторых устройств
  • 1Почему я постоянно получаю исключения ActivityNotFound?
  • 1Как справиться с ошибкой возвышения в pywinauto или pyautoit?
  • 1Почему оценщик TensorFlow не может сделать это простое предсказание линейной регрессии
  • 0динамические данные ng-repeat не отображаются, пока доступны теги
  • 0Vimeo Advanced API, удаление приложений
  • 0Расширение Magento Checkout — перейти к следующему шагу в Checkout
  • 1Добавьте строку над определенным тегом XML и одну строку ниже конечного тега XML
  • 0Как поместить прямоугольник в середину
  • 0как читать из большого текстового файла в массив с ++
  • 1MVC 5 Не удается неявно преобразовать тип ‘System.Linq.IQueryable в bool?
  • 0Получить QImage или QPixmap из QStandardItemModel — TableView
  • 1InvalidCastException Ошибка, вызванная строкой БД?
  • 0Проверка Jquery на содержание div
  • 0Что происходит, если функция нового обработчика не написана должным образом или не может освободить больше памяти в c ++
  • 1Как заставить самсунг момент соединиться с adb
  • 1Vue.js: передача внешней переменной компоненту через инициализацию?
  • 0Двухстороннее крепление для углового ремня
  • 0Изменение цвета маршрута маршрута карты Google с перемещением навигатора от одной точки к другой.
  • 0C ++ Статический массив
  • 0DataStudio Mysql Connection — пользователь отклонен
  • 0Однократная инициализация переменной в cocos2d-x
  • 0Mean.js — Использование URL в качестве параметра Mongoose
  • 0Как повернуть фоновое изображение с помощью CSS и с эффектом затухания?
  • 0Yeoman — Grunt часы не смотрят все файлы приложения
  • 0Это безопасный способ реализации обработки ошибок?
  • 0n-дитя детей каждого другого дива
  • 0Язык браузера и кнопка Facebook
  • 0Ошибка C ++ STATUS_ACCESS_VIOLATION
  • 1Как настроить страницу по умолчанию для открытия папки, когда пользователь вводит URL-адрес папки?
  • 0Mysql enum не ищет запись без значения цитаты
  • 1Правильный способ записи данных JSON, возвращаемых из запроса SPARQL в Python
  • 1Использование ActionProvider файла — Eclipse CNF
  • 1Вход в БД Oracle
  • 1ArrayIndex в XMLAttribute

Сообщество Overcoder

Понравилась статья? Поделить с друзьями:
  • Error one or more errors occurred блок страйк
  • Error one of the params is missing or invalid click for technical details
  • Error on subcontainer ia addr insert
  • Error on row number 1 virtual path must be absolute
  • Error on rename sql