0 / 0 / 0
Регистрация: 04.04.2013
Сообщений: 10
1

Ошибка при перегрузка конструктора. Родительский объект инициализирует поле по умолчанию

05.04.2015, 20:33. Показов 1734. Ответов 3
Метки нет (Все метки)

простейший объект field с двумя полями int является полем класса Capp.
поле с типом field создается и конструируется по умолчанию без аргументов.

Код:

файл field.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
const int DEF_WT=50;
const int DEF_HT=50;
 
class field
{
    public:
        field(int wt, int ht);   // изменение порядка конструкторов ничего не меняет
        field(int x);
        field();                    //конструктор по умолчанию
        int wt, ht;
 
};
файл field.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "field.h"
field::field()
{
    wt=DEF_WT;
    ht=DEF_HT;
}
field::field(int x)
{
    wt=x;
    ht=x;
 
}
field::field(int mwt, int mht)
{
    wt=mwt;
    ht=mht;
}
Capp.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
#ifndef CAPP_H_INCLUDED
#define CAPP_H_INCLUDED
#include "field.h"
class Capp {
    public:
        Capp();
        field startfield;    //поле объекта инициализируется конструктором по умолчанию, а  надо чтобы выбирал.
        int run();
};
#endif // CAPP_H_INCLUDED
Capp.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
#include "Capp.h"
Capp::Capp()
{
    startfield= new field(5); // ошибка "invalid user-defined conversion from 'field*' to 'const field&' [-fpermissive]"
}
int Capp::run()
{
    field* myfield= new field(5);//переменная указатель создается. без * ошибка "invalid conversion from 'field*' to'int'[-fpermissive]"
    return 0;
}
main.cpp
C++ (Qt)
1
2
3
4
5
#include "Capp.h"
int main(int argc, char* argv[]){
    Capp theApp;
    return theApp.run();
}
нужно чтобы класс Capp мог инициализировать свое поле startfield разными конструкторами. Изменить в процессе работы получилось, но надо при создании.
быстрое гугление const ответа на вопрос не дало.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2015, 20:33
Ответы с готовыми решениями:

Конструктор создает и инициализирует объект или только инициализирует?
Подобная тема, в ней сказано, что конструктор - только инициализатор. Пожалуй, в отношении C# - это...

Ошибка: нет подходящего конструктора по умолчанию
В общем ребят, такая проблема, решил начать обучение плюсов по книжке, там задание создать класс и...

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого!
Друзья! Обнаружил пробел в знаниях. Собсно, вопрос в теме. Дополню лишь: поля объекта меняются на...

Ошибка конструктора: как создать объект?
Есть такой скрипт: (function(root, factory) { if (typeof define === 'function' && define.amd)...

3
Эксперт С++
8706 / 4290 / 954
Регистрация: 15.11.2014
Сообщений: 9,730
05.04.2015, 20:36 2
замените:

C++
1
2
3
4
Capp::Capp()
{
    startfield= new field(5); // ошибка "invalid user-defined conversion from 'field*' to 'const field&' [-fpermissive]"
}
на

C++
1
2
3
Capp::Capp()
    :startfield(5)
{}
1
0 / 0 / 0
Регистрация: 04.04.2013
Сообщений: 10
05.04.2015, 21:09  [ТС] 3
Спасибо.

Добавлено через 16 минут
А в книге Страуструпа про это на какой странице написано? (возможно я был невнимателен)
0
Эксперт С++
8706 / 4290 / 954
Регистрация: 15.11.2014
Сообщений: 9,730
05.04.2015, 21:35 4
Лучший ответ Сообщение было отмечено ЛезгиноХохол как решение

Решение

Цитата Сообщение от ЛезгиноХохол Посмотреть сообщение
А в книге Страуструпа про это на какой странице написано? (возможно я был невнимателен)
Официально данная запись называется "списки инициализации".


http://fet.aics.ru/doc/straus_cpp/C++.pdf

5.5.4 Объекты класса как члены

Рассмотрим пример:
C++
1
2
3
4
5
6
7
class classdef {
 table members;
 int no_of_members;
 // ...
 classdef(int size);
 ~classdef();
};
Цель этого определения, очевидно, в том, чтобы classdef содержал член, являющийся таблицей
размером size, но есть сложность: надо обеспечить вызов конструктора table::table() с параметром size.
Это можно сделать, например, так:
C++
1
2
3
4
5
6
classdef::classdef(int size)
 :members(size)
{
 no_of_members = size;
 // ...
}
Параметр для конструктора члена (т.е. для table::table()) указывается в определении (но не в описании)
конструктора класса, содержащего член (т.е. в определении classdef::classdef()). Конструктор для члена
будет вызываться до выполнения тела того конструктора, который задает для него список параметров.

(ц) Бьярн Страуструп
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2015, 21:35
Помогаю со студенческими работами здесь

Пояснение к аргументам при вызове функции, и запрет конструктора по умолчанию
Вобщем касательно конструктора такой код: class box { public: box(int t):z(t){y=6;} void...

ошибка нет подходящего конструктора по умолчанию, но мне на самом деле нужна пустая переменная
Проблема в main.cpp строка 15, мне нужна пустая переменная. До того как я добавил строки 25-27 из...

Ошибка в поле значение по умолчанию
Доброго времени суток! Столкнулся со следующей проблемой. Есть форма...

"error2512: нет подходящего конструктора по умолчанию" при создании массива объектов (SFML-2.1)
Вот скрипт #include < SFML/Graphics.hpp > bool xy; class Block{ public: int x; int y;


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru