Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) ICL: а где нормальная диагностика? (число прочтений - 6925 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
ICL: а где нормальная диагностика?
18. Марта 2008 :: 21:10
Печать  
Что-то вдруг мне тут так захотелось, чтобы компилятор выдавал нормальную диагностику разной ерунды.
Но никак не получилось.

Код
Выбрать все
#include "stdafx.h"
#include <iostream>

using std::cout;
using std::endl;

class b
{
public:
	void get(int a = 111) {cout << "b::get " << a << endl; };

	int m;
};

class d : public b
{
public:
	void get(int a = 222) { cout << "d::get " << a << endl; };

	int m;
};

int main(int argc, char* argv[])
{
	d obj;
	obj.get();

	b* pb = &obj;
	pb->get();

	cout << &obj.b::m << ":" << &obj.m << endl;

	return 0;
}
 



Хотелось увидеть хоть пару слов про то, что
- d::m скрывает b::m
- get невиртуальна,
- get определяет различные значения по умолчанию

и т.д.

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

P.S.
для msvc любых версий, впрочем, и деструктор пофиг...
  

De quelle planète es-tu?
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICL: а где нормальная диагностика?
Ответ #1 - 19. Марта 2008 :: 04:05
Печать  
kms писал(а) 18. Марта 2008 :: 21:10:
- d::m скрывает b::m
- get невиртуальна,

Кстати, а почему должен что-либо говорить? В книжках пишут, что такой код имеет право на существование и компилятор не может давать советов в этом случае.

kms писал(а) 18. Марта 2008 :: 21:10:
- get определяет различные значения по умолчанию

А вот тут да, крайне неприятный момент. Либо у Фаулера, либо у Александреску этому моменту уделено внимание. Тут бы нужно компилятору, что-то говорить.
« Последняя редакция: 19. Марта 2008 :: 05:18 - spock »  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICL: а где нормальная диагностика?
Ответ #2 - 19. Марта 2008 :: 04:16
Печать  
spock писал(а) 19. Марта 2008 :: 04:05:
kms писал(а) 18. Марта 2008 :: 21:10:
- get определяет различные значения по умолчанию

А вот тут да, крайне неприятный момент. Либо у Фаулера, либо у Александреску этому моменту уделено внимание. Тут бы нужно компилятору, что-то говорить.

Имхо, в этом случае показателен был бы такой пример:
virtual void get(int a = 111) {cout << "b::get " << a << endl; };
« Последняя редакция: 19. Марта 2008 :: 05:18 - spock »  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICL: а где нормальная диагностика?
Ответ #3 - 19. Марта 2008 :: 05:00
Печать  
kms писал(а) 18. Марта 2008 :: 21:10:
Что-то вдруг мне тут так захотелось, чтобы компилятор выдавал нормальную диагностику разной ерунды.
Но никак не получилось.

[code]
Хотелось увидеть хоть пару слов про то, что
- d::m скрывает b::m
- get невиртуальна,
- get определяет различные значения по умолчанию

Борланд С++ Билдер вроде говорил о подобном Улыбка
На самом деле диагностика в виде предупреждений, конечно, должна быть.
И в 1С++ мы ее добавим после того, как она обнаружится в обычных компиляторах Улыбка Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ICL: а где нормальная диагностика?
Ответ #4 - 19. Марта 2008 :: 08:19
Печать  
trdm

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

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ICL: а где нормальная диагностика?
Ответ #5 - 19. Марта 2008 :: 08:29
Печать  
spock писал(а) 19. Марта 2008 :: 04:05:
Кстати, а почему должен что-либо говорить? В книжках пишут, что такой код имеет право на существование и компилятор не может давать советов в этом случае.

С точки зрения языка - конечно имеет, ибо С++ оставляет выбор за разработчиком.
С точки зрения теории ООП и ее реализации в С++ - не имеет, т.к. открытое наследование - это моделирование отношений "является", а стало быть здесь либо неверное с точки зрения ООП переопределение инвариантов относительно специализации (функция-член get()), либо get() должна быть виртуальной.
Насчет переменной - тут стандартное скрытие имени переменной, в других случаях интел его диагностировать умеет.

Компилятор здесь может давать советы, стандарт не запрещает.
Кстати, другая проблема неполного скрытия имен интелом диагностируется:

Код
Выбрать все
class b
{
public:
	virtual void get1() {};
	virtual void get1(int) {};
};

class d : public b
{
public:
	virtual void get1(int){};
};
 



spock писал(а) 19. Марта 2008 :: 04:16:
Имхо, в этом случае показателен был бы такой пример:
virtual void get(int a = 111) {cout << "b::get " << a << endl; };

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

P.S.
Ну я вчера, в принципе, и начал с того, что "мне бы хотелось", ибо вопросы эти - на усмотрении компилятора, заставить никак нельзя.
Просто представил себе угрюмого разработчика, который не отошел после нового года, с утра не похмелился,
пришел на работу - и забацал такую иерархию - а компилятор тоже молчит, тоже после  нового года... И мне так жаль их стало... Очень довольный
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: ICL: а где нормальная диагностика?
Ответ #6 - 19. Марта 2008 :: 19:31
Печать  
kms писал(а) 18. Марта 2008 :: 21:10:
но ничего не сказала золотая рыбка...
только хвостом недовольно махнула насчет невиртуального деструктора...
а что ей, сложно что ли, было сказать что-нибудь?

Если рассматривать это держа в руках огромную дубину с надписью "ООП", то компилятор да - ведет себя некрасиво. Улыбка Но переопределение невиртуальной функции базового класса в производном может использоваться для простого устранения дублирования кода. Т.е. реализуем в базовом классе некий базовый функционал. Наследуем от этого класса кучку производных и в некоторых переопределяем какую-нибудь функцию. При этом базовый класс сам по себе вообще нигде может не использоваться, а сами классы не образуют какой-либо иерархии с точки зрения ООП. Вот даже припомнил у себя одно или даже два места, где подобное решение использовалось. Соответственно, если бы компилятор начал бы тут вылезать со своей заботливостью, то пришлось бы наоборот затыкать ему пасть. Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ICL: а где нормальная диагностика?
Ответ #7 - 19. Марта 2008 :: 20:50
Печать  
Не вопрос, но тогда по идее это - закрытое наследование.
Хотя я догадываюсь, что список using-деклараций тебе писать было лениво. Подмигивание
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: ICL: а где нормальная диагностика?
Ответ #8 - 19. Марта 2008 :: 21:06
Печать  
kms писал(а) 19. Марта 2008 :: 20:50:
Не вопрос, но тогда по идее это - закрытое наследование.
Хотя я догадываюсь, что список using-деклараций тебе писать было лениво. Подмигивание

Это чтобы при изменении базового класса эти юсинги во всех производных переколупывать? Нет уж. Улыбка Юсинги здесь ничем не лучше, например, связки агрегирование+делегирование. В общем, нет в таком случае никакого ООП. И иерархии никакой нет. Граблей, соответственно, тоже. Если бы была иерархия, то тогда можно было бы и по "правильному" делать.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ICL: а где нормальная диагностика?
Ответ #9 - 19. Марта 2008 :: 21:44
Печать  
Ну в принципе, да... кривой задаче - кривое решение.
Только в раздел ООП об этом не пиши Смех

P.S.
Я так знал, что ты потихоньку начнешь отказываться от всякой разной батвы в С++ в пользу простого и понятного стиля программирования С Улыбка
Шутка Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: ICL: а где нормальная диагностика?
Ответ #10 - 19. Марта 2008 :: 21:47
Печать  
kms писал(а) 19. Марта 2008 :: 21:44:
Ну в принципе, да... кривой задаче - кривое решение.
Только в раздел ООП об этом не пиши Смех

Улыбка Нет тут ничего кривого. И задача нормальная, и решение. И нечего тут фанатизм разводить. Скоро начнешь рассказывать про обязательность виртуальных деструкторов в любом базовом классе.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ICL: а где нормальная диагностика?
Ответ #11 - 19. Марта 2008 :: 21:55
Печать  
Uzhast писал(а) 19. Марта 2008 :: 21:47:
kms писал(а) 19. Марта 2008 :: 21:44:
Ну в принципе, да... кривой задаче - кривое решение.
Только в раздел ООП об этом не пиши Смех

Улыбка Нет тут ничего кривого. И задача нормальная, и решение. И нечего тут фанатизм разводить. Скоро начнешь рассказывать про обязательность виртуальных деструкторов в любом базовом классе.

Опс. А я там еще и чуток дописал...
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ICL: а где нормальная диагностика?
Ответ #12 - 19. Марта 2008 :: 21:56
Печать  
Uzhast писал(а) 19. Марта 2008 :: 21:47:
kms писал(а) 19. Марта 2008 :: 21:44:
Ну в принципе, да... кривой задаче - кривое решение.
Только в раздел ООП об этом не пиши Смех

Улыбка Нет тут ничего кривого. И задача нормальная, и решение. И нечего тут фанатизм разводить. Скоро начнешь рассказывать про обязательность виртуальных деструкторов в любом базовом классе.

Ну не, на эту тему не беспокойся. Улыбка
Лучше рассказал бы, что это за куча классов, которые никак не связаны, кроме как реализацией?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: ICL: а где нормальная диагностика?
Ответ #13 - 19. Марта 2008 :: 22:39
Печать  
to kms.
В этой теме ты сделал как минимум два совершенно неверных предположения, вообще ни на чем не обоснованных.
1) По поводу кривой задачи, не зная ничего о задаче.
2) О моем стиле кодирования, не зная, когда я написал этот код.

Сначала подумал, что вообще ничего не буду отвечать, но потом решил все же ответить.

Задача состоит в необходимости реализовать некий класс-коллекцию. Коллекция содержит уникальные элементы. В нее можно добавлять новый элемент и коллекция должна вернуть некий индекс элемента. Если добавляется уже существующий элемент коллекция должна вернуть индекс существующего. Далее, коллекция должна выводить все элементы в некий поток с упорядочиванием по индексам.

Проблема в том, что для различных типов элементов коллекция должна возвращать индекс по разным хитрым алгоритмам. Например, для одного типа до количества N коллекция должна возвращать индексы как есть, а, начиная с N, она должна возвращать индекс, увеличенный на 1. Или, для другого типа, коллекция должна выдавать индексы, начиная с некого смещения.

Я сделал шаблонный класс, в котором была некая умолчальная реализация функции добавления элемента - она возвращала обычный индекс, начиная с 0. Для каждого конкретного типа определялся производный класс (если требуется), где переопределялась функция добавления - она вызывала функцию базового класса, а потом манипулировала с индексами, как это требуется.

СЕЙЧАС я бы, скорее всего, выкрутился через специализации шаблонов. Но ТОГДА, когда я писал как раз в стиле "C к классами", я выбрал то решение, которое есть. Сам видишь, что стоит твое предположение о моем текущем стиле кодирования  Улыбка

Не смотря на то, что сейчас я бы выбрал другой способ решения, я не считаю, что существующее решение некорректно. Это вполне допустимое решение и в некоторых случаях в будущем я не исключаю, что буду и дальше использовать решения подобного типа.

PS. Если ты и дальше собираешься использовать подобный стиль общения, то лучше сообщи заранее. Сэкономишь и себе и мне кучу времени.

PPS. Вообще, надо бы запретить редактирование постов. А то завелся тут любитель посты поредактировать, а потом еще удивляется...
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICL: а где нормальная диагностика?
Ответ #14 - 20. Марта 2008 :: 03:43
Печать  
бугага
ps: извините не удержался.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать