Problem z verctor w klasie.

0

Witam, mam problem z obsługą kontenerów vector, najpier przedstawię kod modułu:
Plik ConsoleFrame.h:

//---------------------------------------------------------------------------

#ifndef ConsoleFrameH
#define ConsoleFrameH
//---------------------------------------------------------------------------
#include <vector>
using std::vector;

class ConsoleFrame{
    private:
    //---------- DEFINICJA TYPOW ZMIENNYCH PRYWATNYCH-------------------
        struct FT{
        unsigned char left_top,    top,     right_top,
                      left_center, center,  right_center,
                      left_bottom, bottom,  right_bottom;
        };
    vector<FT> FrameType;
    public:
        ConsoleFrame();
        ~ConsoleFrame();
};
#end 

Plik ConsoleFrame.cpp:

 //---------------------------------------------------------------------------

#pragma hdrstop

#include "ConsoleFrame.h"

//---------------------------------------------------------------------------
ConsoleFrame::ConsoleFrame(){
FrameType.push_back();
}
ConsoleFrame::~ConsoleFrame(){

}
#pragma package(smart_init)

Przy kompilacji w turbo c++,Visual c++,Dev-cpp wywala mi taki błąd:
[C++ Error] ConsoleFrame.cpp(9): E2193 Too few parameters in call to 'std::vector<ConsoleFrame::FT,std::allocator<ConsoleFrame::FT> >::push_back(const ConsoleFrame::FT &)'

Problem w tym że gdy tak obsługuje vector w programie głownym jest wszystko w porządku, a co najciekawsze w Borland C++ Builder 6 Personal już napisałem 80% poterzebnej mi klasy i działa jak trzeba ale w żadnym innym kompilatorze nie chce. To znaczy że w Borland C++ Builder 6 Personal odbiegaja od standardu? Niech mi ktoś wytłumaczy dlaczego tak się dzieję, jak zaimplementować to poprawnie i jak działa poprawy kod. Z góry dziękuję za odpowiedź.

0
ConsoleFrame::ConsoleFrame(){
FrameType.push_back();
}

push_back() przyjmuje referencję do obiektu, a Ty nic nie pchasz do wektora, więc jaki sens w używaniu push_back()?

0

Tylko że w Borland C++ Builder 6 Personal chodziło aż miło. Nie wiem jak to możliwe. W jaki sposób mam dać referencje?

0

o_O Ale co to wg ciebie robi? Normalnie wygląda to tak:

  • tworzysz tablicę - vector
  • wywołując tablica.push_back(element) powodujesz dodanie tego elementu do tablicy
    Co wg ciebie robi tablica.push_back() bez podanego argumentu?
0

Według mnie jeżeli tablica jest typu mojej struktury wywołanie push_back() bez argumentu powoduje stworzenie kolejnego nie zainicjowanego pola tablicy o typie tej że struktury. Co prawda działało mi to ale miałem problem z usówaniem elementów. Może ktoś mi przedstawić poprawny kod?

0

Jeśli Borland faktycznie takie coś wspiera (a mam dość spore wątpliwości...) to jest to niestandardowe rozszerzenie i nie powinno sie na czymś takim opierać. Musisz teraz pozamieniać to na

FT frame;
FrameType.push_back(frame);

Ale w ogóle wykorzystać mechanizm vector::reserve() i vector::resize() które są stworzone do tego...

0

Teraz rozumiem. Mam jeszcze jedno pytanie. W argumencie pakuje zmienna typu struktury która jest jednoczeście typem tablicy to w dodanym elemencie tablicy mam wartości zmiennej podanej w argumencie tak?

0

Nie bardzo rozumiem, ale: dodajesz do vectora identyczną kopię, przekazanego jako argument, obiektu.

0

Chodzi mi o to że jak wypełnie frame i dam ja w push_back(frame) to ten tworzony element tablicy będzie miał te dane które wprowadzę wcześniej w frame. Temat do zamkniecia. Poprawiłem moja klase i ładnie się wszystko kompiluje. Bardzo dziękuję za pomoc.

0

Mam jeszcze jedno pytanie. Jest możliwość pobrania znaku już napisanego w konsoli? Np. wyswietlam jakis tekst
cout<<"blablabla";
to mogę pobrac juz wypisany znak?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0