Още C++ простотии

22 отговора 840 прегледа
#1

Още C++ простотии


class A
{
protected:
char C;

public:
A & operator >> (char & _value)
{
_value = C;
return *this;
}
};

class B : public A
{
public:
/*
B & operator >> (B & _value)
{
_value.C = C;
return *this;
}
*/
};

int main(int, char*[])
{
B b;
char c;
b >> c; // след разкоментаряване на оператора в класа B, това вече не работи, a иначе си работи.

return 0;
}





Отговор
в отговор на - #2

Re: Още C++ простотии

Pa da zemesh da turish i
B &B::operator>>(char &_value)
?

Отговор
в отговор на Potencialen emigrant #3

Re: Още C++ простотии

Това е най-лесното да го направя (и съм го направил), но не мога да разбера, защо има проблем с overloaded members при наследяване. Примера който съм дал е валиден и за обикновенн метод на родителския клас, който докато няма overload в класа-наследник работи и се ползва наготово от наследниците. Ако обаче направя метод със същото име и други параметри в класа-наследник (overload), то за да работят подобните методи от класа-родител е необходимо всичките да се предефинират в класа-наследник. Това ми се вижда много безмислено. Всичките те са public и съответно са видими в наследниците. Какъв му е проблема на компилатора/езика тогава?

Отговор
в отговор на - #4

P.S.

Хванах му цаката на оверлоадването, но ще Ви оставя да си поблъскате малко главите (ако искате).

Отговор
в отговор на - #5

Re: P.S.

Хванал си на баба си шортите ... Я си дочети книгата и след това помисли къде трябва да сложиш: using A::operator >>;

Отговор
в отговор на Пpяk op #6

Re: P.S.

Много преди да хвана на баба си шортите, опитах първо с "using". Това доведе до "Internal compiler error at ....". (последното си е проблем на Borland C++ Builder, но ме подведе достатъчно ). С VC++ нещата с using си работят.
А за проблема на Borland, ако те интересува, мога да ти постна примерен код, който генерира "internal compiler error" точно на мястото на using :-( за който и да е метод от класа-родител.

Отговор
в отговор на - #7

Re: P.S.

Това дето си го постнал, заедно с малката корекция за която стана дума се компилира с Borland C++ 5.5.1. ... ( и с gcc, че и c VC6 ) ... Нещо друго ще да си набъркал!

П.С.: Знака подчертавка ( "_" ) преди променлива в GNU конвенцията за кодиране се ползва за член променливи.

Отговор
в отговор на Пpяk op #8

Пробвай това с Borland C++ Builder 5.0


template <class T>
class A
{
protected:
T C;

public:
A & operator >> (T & _value)
{
_value = C;
return *this;
}
};

template <class T>
class B : public A<T>
{
public:
using A<T>::operator >>;

B & operator >> (B & _value)
{
_value.C = C;
return *this;
}
};

typedef B<char> C;

int main(int, char*[])
{
C c1;
char c;

c1 >> c;

return 0;
}





"Borland C++ Builder Version 5.0 (Build 12.34) Update Pack 1" не компилира този сорс!
VC++ .NET го компилира без проблем.

Отговор
в отговор на Potencialen emigrant #9

Re: Още C++ простотии

Абе човек ти кога ще вземеш да имигрираш накрая...?

Отговор
в отговор на - #10

Re: Пробвай това с Borland C++ Builder 5.0

И под Linux е така. gcc се справя, borland се дъни.

$ g++ --version
g++ (GCC) 3.2 (Mandrake Linux 9.0 3.2-1mdk)

$ ../bc++ --version
Borland C++ 5.7 Open Edition Copyright (c) 1987, 2002 Borland

Assertion failed t.cc(37) : type->t.td.tdEnclType->tpTopType == T_TMPLDEP at ../../../indep/template.c(8242)
Aborted (core dumped)

Отговор
в отговор на EvilProgrammer #11

Re: Още C++ простотии

Nedey da razbirash psevdonima mi bukvalno... Vsyshtnost, nikoga ne sym iskal da emigriram ot Bylgariya.
BTW, poznavame li se, otkyde znaesh, che vse pak ne sym emigriral?

Отговор
в отговор на hoopla #12

Re: Пробвай това с Borland C++ Builder 5.0

Постнах им вчера един "bug report" на Borland, пък ще видим. Баси шантавата работа. Сецнаха ми работата на средата, а фирмата се е изръсила сума си пари за Borland-ски компилатори и лицензи. Изръсила се е и за Microsoft-ски, ама нещата трябваше да върват и на двата.
Досега ме кефеше Borland, ама от вчера насам май са ми по-симпатични Microsoft. За GNU изобщо не става дума .

Отговор
в отговор на - #13

Re: Пробвай това с Borland C++ Builder 5.0

Да, това с template-ите Borland не го вдяват за разлика от всички останали ... пробвах го с free компилатора им.

Прав си да им се нервиш. Извинявай за грубия ми тон вчера, но с този пример трябваше да почнеш.

Отговор
в отговор на Potencialen emigrant #14

Re: Още C++ простотии

Ne, prosto predpolojih che kulturno bi si smenil nika ako eventualno emigrirash...

Отговор
в отговор на EvilProgrammer #15

Re: Още C++ простотии

Tova dori ne mi e hrumvalo, az sym veren na tradiciite :-)

Отговор
в отговор на Potencialen emigrant #16

Re: Още C++ простотии

Този разговор ми припомня следната случка с мой приятел-емигрант в Щатите.

В неговата фирма наскоро се развъртяла метлата на съкращенията и станало изведнъж много сураво и кураво, не само за емигрантите.
Местен абориген (кореняк американец) се жалва на приятеля ми:
"Ееех, добре си си ти! Ами аз!? Нито мога да емигрирам в Щатите, защото съм си там, нито мога да се върна вкъщи, защото съм си вкъщи!"

(Това май беше повече за клуб "Емиграция", ама карай да е весело!

Пиркс

Отговор
в отговор на Пpяk op #17

Re: Пробвай това с Borland C++ Builder 5.0

Аз продължавам на VC++, а Borland дано се сетят си оправят бъговете. Пробвах и с C++ Builder 6.0 Enterprise ($5500) - и там бъгчето си го има и не е ясно докога ще го влачат.

Отговор
в отговор на - #18

Re: Пробвай това с Borland C++ Builder 5.0

icc също го компилира без проблеми.

$ icc -V
Intel(R) C++ Compiler for 32-bit applications, Version 6.0.1 Build 20020822Z
Copyright (C) 1985-2002 Intel Corporation. All rights reserved.

Отговор
в отговор на Пpяk op #19

Re: P.S.

GNU konwencijata za "kodirane" mozhesh da si ja nawresh tam deto Richard Stallman ne gree.

Отговор
в отговор на gnus #20

Re: P.S.

Хехе :) Линус, ти ли си бе?

[url][линк]
First off, I'd suggest printing out a copy of the GNU coding standards, and NOT read it. Burn them, it's a great symbolic gesture.

Отговор