Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wzorce, const i brak copy&paste

Ostatnio zmodyfikowano 2009-07-14 11:46
Autor Wiadomość
DejaVu
» 2009-07-13 23:05:55
Nie wiedziałem, że masz takie problemy z programowaniem.
C/C++
#include <iostream>
using namespace std;

template < typename T >
class Foo
{
public:
    void bar( const T * typ )
    {
        if( typ )
        {
            cout <<( * typ ) << endl;
        } else
        {
            cout << "NULL" << endl;
        } //else
    }
   
    void bar( const T & typ )
    {
        bar( & typ );
    }
}; //class Foo

int main()
{
    Foo < int > ble;
    ble.bar( 123 );
    int * zmienna = NULL;
    ble.bar( zmienna );
    int * zmienna2 = new int( 321 );
    ble.bar( zmienna2 );
    delete zmienna2;
   
    return 0;
}
P-8520
DejaVu
» 2009-07-13 23:13:21
Twój program wywali się wtedy i tak z hukiem gdy przekażesz wskaźnik NULL'owy dla takiego samego kodu. Jeśli tego nie widzisz to może język D rozwiąże Twój problem lepiej.
P-8521
DejaVu
» 2009-07-13 23:18:23
C/C++
#include <iostream>
using namespace std;

template < typename T >
class Foo
{
public:
    void bar( T * const typ )
    {
        if( typ )
        {
            cout <<( * typ ) << endl;
        } else
        {
            cout << "NULL" << endl;
        } //else
    }
   
    void bar( const T & typ )
    {
        bar( const_cast < T *>( & typ ) );
    }
}; //class Foo

int main()
{
    Foo < int > ble;
    ble.bar( 123 );
    int * zmienna = NULL;
    ble.bar( zmienna );
    int * zmienna2 = new int( 321 );
    ble.bar( zmienna2 );
    delete zmienna2;
   
    return 0;
}
A to Ciebie zadowala?
P-8522
DejaVu
» 2009-07-13 23:25:54
Szczerze mówiąc to nie rozumiem Ciebie teraz. Masz metodę, która może przyjmować:
[li]const T&[/li]
[li]const T*[/li]
[li]T* const[/li]
i mówisz, że żadna Ci nie pasuje pomimo, że realizowane jest Twoje założenie.
P-8523
pompom
» 2009-07-13 23:29:10
C/C++
#include <iostream>

using namespace std;

template < class T >
struct X {
    void foo( T & a ) { cout << "T " << a << endl; }
};

template < class T >
struct X < T *> {
    void foo( T * a ) { cout << "T* " << * a << endl; }
};

int main()
{
    int a = 23;
    X < int >().foo( a );
    X < int *>().foo( & a );
    X < int *>().foo( a ); //blad
}
P-8524
pompom
» 2009-07-13 23:35:55
Omg. To sobie dodaj const.
A na dublowanie kodu nie ma chyba innej rady niż dziedziczenie.
P-8525
pompom
» 2009-07-13 23:43:03
Co bzdury? Czego nie rozumiesz?
C/C++
#include <iostream>

using namespace std;

template < class T >
struct X {
    void foo( const T & a ) { cout << "T " << a << endl; }
};

template < class T >
struct X < T *> {
    void foo( const T * a ) { cout << "T* " << * a << endl; }
};

template < class T >
struct Y
    : public X < T >
{
    int b;
    Y( int _b )
        : b( _b )
    { }
    void bar() { cout << "b " << b << endl; }
    //reszta kodu
};

int main()
{
    int a = 23;
    Y < int >( 1 ).foo( a );
    Y < int *>( 1 ).foo( & a );
    //Y<int*>().foo(a); //blad
    Y < int >( 1 ).bar();
}


d:/kody $ g++ -o wtf.exe wtf.cpp
d:/kody $ ./wtf.exe
T 23
T* 23
b 1
P-8526
DejaVu
» 2009-07-13 23:43:57
On napisał bzdury i usunął je - przywrócę je, żebyś wiedział o co chodzi :)

/edit:
Już sam zmienił posta ale na sensowniejszego.
P-8527
« 1 » 2 3
  Strona 1 z 3 Następna strona