Vinnaren i pepparkakshustävlingen!
2016-11-10, 12:15
  #1
Medlem
Sitter med ett programmeringsprojekt och fastnat lite på en konstruktor.
Har en klass som har en default konstruktor som jag skapat såhär:

Kod:
class Class_A
{
public:

Class_a () :
name{},
active{false},
age{}
place{} {};

private:
string name;
bool active;
string age;
string place;
};

Har sedan en annan klass, låt oss kalla den Class_B som ärver ifrån Class_a.

Kod:
class Class_b : public Class_a
{
Class_b();

private:
array<array<Class_a,4>,4> all_places;
}

Har alltså en array som består av en array med class_a på varje plats.
Problemet är att när jag ska skapa defaultkonstruktorn för Class_a så vet jag inte hur jag ska göra riktigt?
Vill helt enkelt bara sätta alla class_a till null på alla variabler.

Tänker mig att jag måste loopa igenom hela båda arrayerna och för varje plats så ska jag anropa default konstruktorn i class_a.

något i stil med:
Kod:
for(int i{}; i < all_places.size(); i++)
{
for(int j{}; j < all_places.size(); j++)
{
//Här vill jag kalla på default konstruktorn för class_a på plats i,j i class_b arrayen.
//Något i stil med:
all_places.at(i).at(j) = class_a();
}
}

Förslag på hur detta ska göras? Hoppas det var någorlunda förståeligt. Har inte kodat på ca 6 månader (och är rätt nybörjare för den delen också) så har totalt fastnat på detta.

Tack på förhand.
__________________
Senast redigerad av lakejern 2016-11-10 kl. 12:38. Anledning: kodtaggar tillagd och ändring av kod.
Citera
2016-11-10, 12:21
  #2
Medlem
Diamondgrits avatar
Citat:
Ursprungligen postat av lakejern
Har sedan en annan klass, låt oss kalla den Class_B som ärver ifrån Class_a.

class Class_b
{
Class_b();

private:
array<array<Class_a,4>,4> all_places;
}
Har alltså en array som består av en array med class_a på varje plats.
Problemet är att när jag ska skapa defaultkonstruktorn för Class_a så vet jag inte hur jag ska göra riktigt?
Vill helt enkelt bara sätta alla class_a till null på alla variabler.
1. Använd kodtaggar när du postar kod. Du skapar dem genom att klicka på #-tecknet när du postar.

2. Class_b ärver inte från Class_a.

3. Class_a defaultkonstruktor ser lite mysko ut.

4. För att skapa ett objekt och anropa objektets klass konstruktor bör du använda operatorn new.

Annars tänker du ungefär rätt.
Citera
2016-11-10, 12:37
  #3
Medlem
Citat:
Ursprungligen postat av Diamondgrit
1. Använd kodtaggar när du postar kod. Du skapar dem genom att klicka på #-tecknet när du postar.

2. Class_b ärver inte från Class_a.

3. Class_a defaultkonstruktor ser lite mysko ut.

4. För att skapa ett objekt och anropa objektets klass konstruktor bör du använda operatorn new.

Annars tänker du ungefär rätt.

Hej,
Tack för info, kodtaggar är nu tillagda.

2. Missade att skriva in den delen av koden men tillagt nu (den ärver i min riktiga kod)

3. Ser den mysko ut? Jag ger alla variabler värdet null, borde vara korrekt?

4. används inte new bara för pekare?

Verkar som att det kanske funkar nu helt plötsligt, innan klagade den på att '=' operatorn inte fanns, var väl egentligen den delen som jag var osäker på, hur jag skulle kalla konstruktorn.
Citera
2016-11-10, 13:58
  #4
Medlem
Diamondgrits avatar
Citat:
Ursprungligen postat av lakejern
3. Ser den mysko ut? Jag ger alla variabler värdet null, borde vara korrekt?

4. används inte new bara för pekare?

Verkar som att det kanske funkar nu helt plötsligt, innan klagade den på att '=' operatorn inte fanns, var väl egentligen den delen som jag var osäker på, hur jag skulle kalla konstruktorn.
Jag har ändrat mig, det ser bra ut. Men tror att de får null som default? Ja ja.

Jo, new används bara till pekare; även där var jag ute och cyklade, du hade ju skrivit ut antalet i arrayen.
Citera
2016-11-10, 15:28
  #5
Medlem
enowens avatar
Så här skriver du din kod, och använd php-taggarna så folk ser. Lär dig indentera kod om du vill ha hjälp. Om inte proton börjar göra sitt jobb snart så blir de här forumet totalt värdelöst.

Kod:
#include <iostream>
#include <string>
#include <array>

class ClassA
{
    public:
        
ClassA() :
            
m_active{false}
        {}

    private:
        
bool m_active;
        
std::string m_name;
        
std::string m_age;
        
std::string m_place;
};

class 
ClassB : public ClassA
{
    public:
        
ClassB() = default;

    private:
        
std::array<std::array<ClassA4>, 4m_all_places;
};

int main()
{} 

Vad är det du har problem med?
Citera
2016-11-10, 16:48
  #6
Medlem
Diamondgrits avatar
Citat:
Ursprungligen postat av enowen
...
Tack! Ja så ska det se ut, nu kan man läsa koden ju.
Citera
2016-11-10, 17:14
  #7
Medlem
enowens avatar
Citat:
Ursprungligen postat av Diamondgrit
Tack! Ja så ska det se ut, nu kan man läsa koden ju.

Ja, annars blir man ju förvirrad, va tvungen att slänga in skiten i vim.
Hans problem är att han helt enkelt inte vet hur std::array fungerar och vad som behövs på compile-time, förenklad exempel:

Kod:
#include <iostream>
#include <string>
#include <array>

class ClassA
{
    public:
        
ClassA(std::string name) :
            
m_name{name}
        {}

        
std::stringgetName()
        {
            return 
this->m_name;
        }

    private:
        
std::string m_name;
};


int main()
{
    
std::array<ClassA2arr// <--- Error, du måste ha en initialization list, alternativt ange en default constructor för ClassA som inte tar några parametrar

    
for (autoobj arr)
    {
        
std::cerr << obj.getName() << std::endl;
    }


Så:

Kod:
std::array<ClassA2arr{{ClassA{"hejsan"}, ClassA{"hejsan2"}}}; 

är lösningen, detsamma gäller i ClassB konstruktorn om han inte vill skapa objekten på heapen men då ska han köra på unique_ptr när han är igång tycker ja.

Någonting i stil med:

Kod:
#include <iostream>
#include <string>
#include <array>
#include <memory>

class ClassA
{
    public:
        
ClassA(std::string name) :
            
m_name{name}
        {}

        
std::stringgetName()
        {
            return 
this->m_name;
        }

    private:
        
std::string m_name;
};

template <size_t arraySize>
void PrintArray(std::array<std::unique_ptr<ClassA>, arraySize>& arr)
{
    for (
autoobj arr)
    {
        if (
obj)
        {
            
std::cerr << obj->getName() << std::endl;
        }
        else
        {
            
std::cerr << "obj is null" << std::endl;
        }
    }
}

int main()
{
    
std::array<std::unique_ptr<ClassA>, 2arr;
    
PrintArray<2>(arr);

    
arr = {{
        
std::unique_ptr<ClassA>{new ClassA{"hejsan1"}},
        
std::unique_ptr<ClassA>{new ClassA{"hejsan2"}}
    }};
    
PrintArray<2>(arr);

__________________
Senast redigerad av enowen 2016-11-10 kl. 17:44.
Citera
2016-11-10, 17:54
  #8
Medlem
Citat:
Ursprungligen postat av enowen
Ja, annars blir man ju förvirrad, va tvungen att slänga in skiten i vim.
Hans problem är att han helt enkelt inte vet hur std::array fungerar och vad som behövs på compile-time, förenklad exempel:

Kod:
#include <iostream>
#include <string>
#include <array>

class ClassA
{
    public:
        
ClassA(std::string name) :
            
m_name{name}
        {}

        
std::stringgetName()
        {
            return 
this->m_name;
        }

    private:
        
std::string m_name;
};


int main()
{
    
std::array<ClassA2arr// <--- Error, du måste ha en initialization list, alternativt ange en default constructor för ClassA som inte tar några parametrar

    
for (autoobj arr)
    {
        
std::cerr << obj.getName() << std::endl;
    }


Så:

Kod:
std::array<ClassA2arr{{ClassA{"hejsan"}, ClassA{"hejsan2"}}}; 

är lösningen, detsamma gäller i ClassB konstruktorn om han inte vill skapa objekten på heapen men då ska han köra på unique_ptr när han är igång tycker ja.

Någonting i stil med:

Kod:
#include <iostream>
#include <string>
#include <array>
#include <memory>

class ClassA
{
    public:
        
ClassA(std::string name) :
            
m_name{name}
        {}

        
std::stringgetName()
        {
            return 
this->m_name;
        }

    private:
        
std::string m_name;
};

template <size_t arraySize>
void PrintArray(std::array<std::unique_ptr<ClassA>, arraySize>& arr)
{
    for (
autoobj arr)
    {
        if (
obj)
        {
            
std::cerr << obj->getName() << std::endl;
        }
        else
        {
            
std::cerr << "obj is null" << std::endl;
        }
    }
}

int main()
{
    
std::array<std::unique_ptr<ClassA>, 2arr;
    
PrintArray<2>(arr);

    
arr = {{
        
std::unique_ptr<ClassA>{new ClassA{"hejsan1"}},
        
std::unique_ptr<ClassA>{new ClassA{"hejsan2"}}
    }};
    
PrintArray<2>(arr);


Hej!

Sorry med dålig formatering osv, skrev på mobilen och inte postat kod på flashback förut för den delen så kände inte till php osv.
Och ja visst jag kan hålla med om att pekare är bättre, av någon anledning valde min grupp att köra på detta viset med en fast array istället för pekare i och med att vi ska specifikt ha en "plan" som är 5x5.

Problemet var som sagt att jag visste inte hur jag ska skapa själva konstruktorn för classb när den ärver ifrån classa + att jag blev förvirrade när det var array i en array, en kombination av detta ställde till det men med lite hjälp här + google så ska det nog gått igenom nu.

Ursäkta igen för dåligt upplägg av inlägget, kan låsa denna tråd.-
Citera
2016-11-10, 18:34
  #9
Moderator
RostigHinks avatar
Citat:
Ursprungligen postat av enowen
Så här skriver du din kod, och använd php-taggarna så folk ser. Lär dig indentera kod om du vill ha hjälp. Om inte proton börjar göra sitt jobb snart så blir de här forumet totalt värdelöst.
Kod:
#include <iostream>
#include <string>
#include <array>

class ClassA {
 public:
  ClassA() : m_active{false} {}

 private:
  bool m_active;
  std::string m_name;
  std::string m_age;
  std::string m_place;
};

class ClassB : public ClassA {
 public:
  ClassB() = default;

 private:
  std::array<std::array<ClassA, 4>, 4> m_all_places;
};

int main() {}
Jo, det blir rätt oläsbart utan formatering. Ovan är hur vi formaterar på jobbet enligt vår kodningsstandard. Men nog med OT Ville bara visa att det finns flera standarder.
__________________
Senast redigerad av RostigHink 2016-11-10 kl. 18:37.
Citera
2016-11-10, 20:57
  #10
Medlem
enowens avatar
Citat:
Ursprungligen postat av RostigHink
Kod:
#include <iostream>
#include <string>
#include <array>

class ClassA {
 public:
  ClassA() : m_active{false} {}

 private:
  bool m_active;
  std::string m_name;
  std::string m_age;
  std::string m_place;
};

class ClassB : public ClassA {
 public:
  ClassB() = default;

 private:
  std::array<std::array<ClassA, 4>, 4> m_all_places;
};

int main() {}
Jo, det blir rätt oläsbart utan formatering. Ovan är hur vi formaterar på jobbet enligt vår kodningsstandard. Men nog med OT Ville bara visa att det finns flera standarder.

Tyvärr så faller inte de där in i min smak men det är lättare att läsa en TS exempel iaf
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback