• 26 646 online
  • 1 176 187 medlemmar
  • 60 685 960 inlägg
2018-06-13, 19:44
  #1
Medlem
Hej!

Jag har sökt runt en del, men har hittills haft lite funderingar hur jag kan applicera lösningar på mitt problem.

Låt säga att jag har två klasser: TestClass definierar jag själv och TestClass2 kommer inbäddad i något bibliotek.

Kod:
header-fil
class TestClass
{
public:
	TestClass();
	void myFunc();
	TestClass2 myObj;
};

Kod:
cpp-fil
#include "TestClass.h"
TestClass::myFunc()
{
	// Stycke 1: Error: "no match for call to..."
	myObj("Active");

	// Stycke 2: Detta funkar dock
	TestClass2 tempObj("Active");
	myObj = tempObj;
}

Vad jag förstår så instansieras myObj redan i headern, när jag egentligen bara vill kunna lagra något senare som myObj, från myFunc(). Det jag undrar är då, finns det något snyggt sätt att spara över myObj (som Stycke 1) från myFunc, eller är det enda sättet att göra som i Stycke 2? Alternativt, har jag missat något som faktiskt innebär att myObj inte instansieras i headern, utan att det funkar som i t.ex. Java:
Kod:
int x;   // Deklarerad men ej instansierad
x = 5; // Instansierad

Jag är relativt ny på c++ så jag är tacksam för all hjälp jag kan få!
Citera
2018-06-13, 21:47
  #2
Medlem
Du har rätt i att myObj instansieras där du tror.

Det enkla svaret är "använd en pekare eller referens istället för att lagra myObj by-value".

En fråga som kanske sprider lite ljus över ditt problem: vad ska hända med myObj om du kopierar en instans av TestClass till en annan (via copy constructor, till exempel). Ska bägge ha varsin kopia av myObj, eller ska de använda samma?

Bl a det bestämmer om du ska göra som du gör eller använda en pekare till TestClass2 som datamedlem (du ska undvika att använda referenser som medlemmar om du inte är säker på vad du gör förresten).

Det beror också på hur du vill att semantiken ska vara - ska ett objekt av TestClass-typ få existera utan att dess myObj gör det? Om inte, så är det "okej" att använda referenser, och då använder du initializer list I konstruktorn för att sätta myObj till något lämpligt.

Skriver på telefonen så hoppas att det inte blev för rörigt!
Citera
2018-06-13, 22:17
  #3
Medlem
Citat:
Ursprungligen postat av luxnest
Du har rätt i att myObj instansieras där du tror.

Det enkla svaret är "använd en pekare eller referens istället för att lagra myObj by-value".

En fråga som kanske sprider lite ljus över ditt problem: vad ska hända med myObj om du kopierar en instans av TestClass till en annan (via copy constructor, till exempel). Ska bägge ha varsin kopia av myObj, eller ska de använda samma?

Bl a det bestämmer om du ska göra som du gör eller använda en pekare till TestClass2 som datamedlem (du ska undvika att använda referenser som medlemmar om du inte är säker på vad du gör förresten).

Det beror också på hur du vill att semantiken ska vara - ska ett objekt av TestClass-typ få existera utan att dess myObj gör det? Om inte, så är det "okej" att använda referenser, och då använder du initializer list I konstruktorn för att sätta myObj till något lämpligt.

Skriver på telefonen så hoppas att det inte blev för rörigt!

Det låter vettigt, jag ska experimentera lite imorgon och se om jag får ihop det, tack!
Citera