Quantcast
Channel: Forum Pasja Informatyki - Najnowsze pytania bez odpowiedzi
Viewing all articles
Browse latest Browse all 21942

Klasa z konstruktorem w dll-ce, wskaźniki

$
0
0

Witam. Postanowiłem korzystając z tego

http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Zaawansowane/DLL/198

poradnika przerobić parę konsolowych klas na WinAPI i umieścić je w dllkach.

Gdy stworzyłem prostą klasę Punkt w dll-ce i miała ona konstruktor (2 inty) to poradziłem sobie tak, że funkcja CreatePunkt wyglądała tak:

Punkt* DLL_EXPORT CreatePunkt(int a, int b)
{
    return new Punkt(a,b);
}

Otóż mam też klasę, w której konstruktorze trzeba podać dwa wskaźniki do tablic stringów. Oto plik menu.h:

#include <iostream>

using namespace std;

class Menu
{
	public:

	string str_wybor;
	string *opcje;
	int opcji;

	Menu(int,int,string*,string*, string="",int=1,int=1);
	~Menu();
	void wyswietl(); //wyświetla główne opcje w menu
	void wybierz(); //czyta wybór użytkownika

	private:

	string *tematy;
	int tematow;
	int wybor;
	int pom;
};

A to plik menu.cpp:

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

using namespace std;

Menu::Menu(int o, int t, string *op, string *tem, string sw, int w, int p)
{
	opcji=o;
	tematow=t;
	str_wybor=sw;
	wybor=w;
	pom=p;

	opcje = new string [opcji+1];

	string *wsk1 = opcje;
	string *wsk2 = op;

	for(int i=0; i<opcji; i++)
    {
        *wsk1 = *wsk2;
        wsk1++;
        wsk2++;
    }

    tematy = new string [tematow];

	string *wsk3 = tematy;
	string *wsk4 = tem;

	for(int i=0; i<tematow; i++)
    {
        *wsk3 = *wsk4;
        wsk3++;
        wsk4++;
    }
}

Menu::~Menu()
{
	delete [] opcje;
	delete [] tematy;
}

void Menu::wyswietl()
{
	fstream plik;
	string linia;

	plik.open("tymczasowe menu.txt", ios::out);

	pom=1;
	for(int l=0; l<opcji; l++)
    {
		if(l==0)
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);
			cout<<opcje[l]<<endl<<endl;
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
			plik<<opcje[l]<<endl<<endl;
		}
		else
		{
			if(  int(opcje[l][0])!=9  )
			{
			    if( is_int_convert(opcje[l]) )
			    {
			        cout<<pom<<". "<<tematy[ atoi(opcje[l].c_str())-1 ]<<endl;
			        pom++;
			    }
			    else
                {
                    cout<<pom<<". "<<opcje[l]<<endl;
                    pom++;
                }
			}
			plik<<opcje[l]<<endl;
		}
    }

	plik.close();
}

void Menu::wybierz()
{
	cout<<"\nWprowadź wybór: ";
	bool czy_wybrano=false;
	if(str_wybor!="")
		czy_wybrano=true;

	cin>>str_wybor;

	while(  !((is_int_convert(str_wybor) && atoi(str_wybor.c_str())>0 && atoi(str_wybor.c_str())<pom) || (str_wybor=="z"&& czy_wybrano==true))  )
	{
		if(str_wybor=="z"&& czy_wybrano==false)
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),4);
			cout<<"Nie wprowadzono wyboru\n";
			cin>>str_wybor;
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
		}
		else
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),4);
			cout<<"Nieprawidłowe dane. Wprowadź jeszcze raz: ";
			cin>>str_wybor;
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
		}
	}

	if( str_wybor != "z")
	{
		pom=1;
		wybor = atoi(str_wybor.c_str());

		//////////////////////////////
		for(int i=0; i<=opcji; i++)
			opcje[i] = "";

		int i=0;
		fstream plik;
		string linia;

		plik.open("tymczasowe menu.txt", ios::in);

		while(getline(plik,linia))
		{
			if(linia.size()==0)
				continue;
			opcje[i] = linia;
			i++;
		}

		plik.close();
		//////////////////////////////

		i=0; 	 //do indeksowania linii w menu
		int j=0; //do indeksowania linii w nowo tworzonym menu
		int temat=0;

		while(i<opcji)
		{
			if( int(opcje[i][0])!=9 && i!=0 )
				temat++;

			if(temat == wybor)
			{
				if(is_int_convert(opcje[i]))
				{
					str_wybor = "z";
					//jeżeli ktoś wybierze już opcję, która jest podstawowa (nie ma dla niej podmenu)
					//to dokonał wyboru (zatwierdził mimo iż nie kliknął z)
				}

				opcje[j]=opcje[i];
				j++;
				i++;

				while( int(opcje[i][0])==9 )
				{
					opcje[j]=opcje[i].erase(0,1);
					j++;
					i++;
				}

				opcji=j;
				j=0;
			}

			i++;
		}
	}
}

Gdy zrobiłem to w dll-ce to wygląda mniej więcej tak:

Menu* DLL_EXPORT CreateObjectMenu(int o, int t, string *op, string *tem, HWND ok, HWND l, HINSTANCE uchwyt)
{
	return new Menu(o, t, *op, *tem, ok, l, uchwyt);
}

Jednak w ten sposób nie działa. A jak zrobię tak:


Menu* DLL_EXPORT CreateObjectMenu(int o, int t, string *op, string *tem, HWND ok, HWND l, HINSTANCE uchwyt)
{
	return new Menu(o, t, op, tem, ok, l, uchwyt);
}

to wyświetla się błąd, że nie można przekonwertować ze string* na string.

 

Ma ktoś jakiś pomysł jak sobie sprytnie poradzić z tymi wskaźnikami?


Viewing all articles
Browse latest Browse all 21942