• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Variable has initializer but incomplete type

Object Storage Arubacloud
0 głosów
692 wizyt
pytanie zadane 22 listopada 2016 w C i C++ przez niezalogowany

Stworzyłem klasę odpowiedzialną za kodowanie i gdy umieszczę jej definicję przed mainem to wszystko jest ok, ale gdy nie ma jej przed mainem tylko w oddzielnym pliku, który zaincludowałem i tworzę obiekt tej klasy to wyświetla się błąd jak w temacie.

Wrzucam kod klasy:

class Coding
{
	string plik1;
	char *co;
	string plik2;
	char *na_co;
	int ile;

	public:

	Coding(string p1, string p2)
	{
		plik1 = p1;
		plik2 = p2;

		fstream plik;
		string linia;

		ile = counting(plik1);

		co = new char [ile];
		char *wsk1 = co;

		na_co = new char [ile];
		char *wsk2 = na_co;

		plik.open(plik1.c_str(), ios::in);
		while(getline(plik,linia))
		{
			*wsk1=linia[0];
			wsk1++;
		}
		plik.close();
		plik.clear();

		plik.open(plik2.c_str(), ios::in);
		while(getline(plik,linia))
		{
			*wsk2=linia[0];
			wsk2++;
		}
		plik.close();
		plik.clear();
	}

    string wys(string napis)
    {
        string linia="";

        for(int i=0; i<napis.length(); i++)
        {
            if( (int)napis[i] >=0 && (int)napis[i]<=255)
                linia = linia + napis[i];
            else
            {
                for(int j=0; j<ile; j++)
                {
                    if( napis[ i ] == co[ j ])
                    {
                        linia = linia + na_co[ j ];
                        break;
                    }
                }
            }
        }

        return linia;
    }
};

A tu funkcja główna:

#include <iostream>
#include <fstream>
#include "text.h"
#include <time.h>

using namespace std;

class Coding
{
	string plik1;
	char *co;
	string plik2;
	char *na_co;
	int ile;

	public:

	Coding(string p1, string p2)
	{
		plik1 = p1;
		plik2 = p2;

		fstream plik;
		string linia;

		ile = counting(plik1);

		co = new char [ile];
		char *wsk1 = co;

		na_co = new char [ile];
		char *wsk2 = na_co;

		plik.open(plik1.c_str(), ios::in);
		while(getline(plik,linia))
		{
			*wsk1=linia[0];
			wsk1++;
		}
		plik.close();
		plik.clear();

		plik.open(plik2.c_str(), ios::in);
		while(getline(plik,linia))
		{
			*wsk2=linia[0];
			wsk2++;
		}
		plik.close();
		plik.clear();
	}

    string wys(string napis)
    {
        string linia="";

        for(int i=0; i<napis.length(); i++)
        {
            if( (int)napis[i] >=0 && (int)napis[i]<=255)
                linia = linia + napis[i];
            else
            {
                for(int j=0; j<ile; j++)
                {
                    if( napis[ i ] == co[ j ])
                    {
                        linia = linia + na_co[ j ];
                        break;
                    }
                }
            }
        }

        return linia;
    }
};


int main()
{
    fstream plik;
    string linia;

    Coding c("znaki diakrytyczne ANSI.txt", "znaki diakrytyczne OEM852.txt");

    float czas;
    clock_t start,stop;

    start = clock();
    plik.open("Odczyt!.txt", ios::in);
    while(getline(plik,linia))
    {
        cout<<c.wys(linia);
        cout<<endl;
        //cout<<linia<<endl;
    }
    plik.close();
    stop = clock();

    czas = (double)(stop-start) / CLOCKS_PER_SEC;
    cout<<"Czas wykonania "<<czas<<" s";

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 22 listopada 2016 przez niezalogowany
Jak dokładnie wygląda kod w sytuacji gdy masz oddzielne pliki? Tzn jak wygląda main.cpp, Coding.cpp, Coding.h?
0 głosów
odpowiedź 22 listopada 2016 przez niezalogowany

Zazwyczaj umieszczam klasę w oddzielnych plikach .h i .cpp, ale to nie jest duża klasa, więc umieściłem ją w pliku text.cpp i text.h, gdzie mam szereg przydatnych funkcji tekstowych. 

text.h

#ifndef text
#define text

using namespace std;

bool is_white(string linia); //sprawdza czy linia składa sie jedynie z białych znaków lub jest pusta
bool is_completely_empty(string linia); //sprawdza czy linia jest pusta
bool is_comment(string linia); //sprawdza czy linia jest komentarzem
bool is_upper(char znak); //sprawdza czy znak jest dużą literą (funkcja uwzględnia też polskie znaki)
bool is_int_convert(string linia); //sprawdza czy linię można przekonwertować na liczbę całkowitą
string without_tab(string linia); //zwraca linię z usuniętymi tabulacjami
int counting(string nazwa); //zlicza ilość linii w pliku
int strtoint(); //prosi o wpisanie poprawnego łańcucha znaków i konwertuje go na liczbę całkowitą
string rewrite(string plik, string *tab);
class Coding;

#endif

text.cpp

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <windows.h>
#include "text.h"

using namespace std;

bool is_white(string linia)
{
	int i=0;
	for(int i=0; i<linia.size(); i++)
	{
		if(isgraph(linia[i]))
			return false;
	}

	return true;
}

bool is_completely_empty(string linia)
{
	if(linia.size()==0)
		return true;
	return false;
}

bool is_comment(string linia)
{
	if(linia[0]=='/' && linia[1]=='/')
		return true;

	return false;
}

bool is_upper(char znak)
{
	if( (int(znak)>64 && int(znak)<91)
		|| int(znak)==-91 || int(znak)==-58 || int(znak)==-54
		|| int(znak)==-93 || int(znak)==-47 || int(znak)==-45
		|| int(znak)==-116 || int(znak)==-113 || int(znak)==-81 )
	return true;

	return false;
}

bool is_int_convert(string linia)
{
	for(int i=0; i<linia.size(); i++)
	{
		if(int(linia[i])<48 || int(linia[i])>57)
			return false;
	}

	return true;
}

string without_tab(string linia)
{
	string linijka="";
	for(int i=0; i<linia.size(); i++)
	{
		if( int(linia[i])!=9 )
			linijka = linijka + linia[i];
	}

	return linijka;
}

int counting(string nazwa)
{
	fstream plik;
	string linia;
	int ilosc_linii=0;
	plik.open(nazwa.c_str(), ios::in);
	while(getline(plik,linia))
		ilosc_linii++;
	plik.close();
	
	return ilosc_linii;
}

int strtoint()
{
    string napis;
    cin>>napis;
    while( !(is_int_convert(napis)) )
	{
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),4);
		cout<<"Nieprawidłowe dane. Wprowadź jeszcze raz: ";
		cin>>napis;
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
	}
	
    return atoi(napis.c_str());
}

void rewrite(string nazwa_pliku, string *tab)
{
	fstream plik;
	string linia;
	int linii=0;
	plik.open(nazwa_pliku.c_str(), ios::in)
	while(getline(plik,linia))
	{
		linii++;
	}
	plik.close();
	
	tab = new string [linii];
	string *wskaznik = tab;
	
	plik.open(nazwa_pliku.c_str(), ios::in)
	while(getline(plik,linia))
	{
		*wskaznik = linia;
		wskaznik++;
	}
	plik.close();
}

class Coding
{
    public:

	string plik1;
	string plik2;
	int ile;

	Coding(string p1, string p2)
	{
		plik1 = p1;
		plik2 = p2;
		
		fstream plik;
		string linia;
		
		ile = counting(plik1);
		
		char *co;
		co = new char [ile];
		char *wsk1 = co;

		char *na_co;
		na_co = new char [ile];
		char *wsk2 = na_co;
		
		plik.open(plik1.c_str(), ios::in);
		while(getline(plik,linia))
		{
			*wsk1=linia[0];
			wsk1++;
		}
		plik.close();
		plik.clear();

		plik.open(plik2.c_str(), ios::in);
		while(getline(plik,linia))
		{
			*wsk2=linia[0];
			wsk2++;
		}
		plik.close();
		plik.clear();
	}
	
    string wys(string napis)
    {
        string linia="";

        for(int i=0; i<napis.length(); i++)
        {
            if( (int)x[i] >=0 && (int)x[i]<=255)
                linia = linia + napis[i];
            else
            {
                for(int j=0; j<ile; j++)
                {
                    if( napis[ i ] == co[ j ])
                    {
                        linia = linia + na_co[ j ];
                        break;
                    }
                }
            }
        }

        return linia;
    }
};

 

Podobne pytania

0 głosów
2 odpowiedzi 321 wizyt
pytanie zadane 9 lipca 2016 w C i C++ przez Patryk Krajewski Nałogowiec (26,170 p.)
0 głosów
1 odpowiedź 318 wizyt
+1 głos
1 odpowiedź 399 wizyt
pytanie zadane 25 lipca 2015 w C i C++ przez criss Mędrzec (172,590 p.)

92,555 zapytań

141,403 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...