簡體   English   中英

在C ++中將對象數組傳遞給另一個類

[英]Passing Array of Objects to Another Class in C++

我創建了一個基類和該類的數組。 我試圖將此數組傳遞給另一個類。 我究竟做錯了什么? 有沒有更優雅的方法可以做到這一點?

class WaypointClass
{
private:
    float latitude, longitude;
public:
    WaypointClass(int lt, int lg)
    {
        latitude = lt;
        longitude = lg;
    }
};

class WaypointList
{
private:
    int currentWaypoint;
    WaypointClass *waypointList;

public:
    WaypointList(WaypointClass *waypoints)
    {
        waypointList = &waypoints;
        currentWaypoint = 0;
    }
};

const WaypointClass waypoints[] =
{ WaypointClass(1, 2), WaypointClass(3, 4), WaypointClass(5, 6) };

WaypointList myWaypoints(&waypoints);

不知道您的錯誤消息是什么,我可以立即看到幾個錯誤:

您將數組聲明為const,這意味着每個元素都無法更改。 但是WaypointList接受一個非常量指針,這意味着它希望能夠更改每個元素。 這可能是您的編譯器錯誤。

另外, foo[]自動轉換為foo* ,因此您不需要使用&取消引用數組。

第二個問題是您將數組傳遞過來,但是沒有傳遞數組的長度,這意味着WaypointList將不知道數組中有多少個路標。

  1. 當將數組作為參數傳遞時,不應使用reference-operator(&)傳遞它。 這樣,您將指針傳遞給該數組,這不是您想要的。

  2. 如果必須將數組聲明為const,則函數簽名中的參數也應為const ex: WaypointList(const WaypointClass *waypoints)

您應該真正使用std::vector而不是數組。

另外,您應該在構造函數中使用初始化程序列表,而不要在主體中使用Assign;如果成員變量為float ,則應在構造函數參數列表中使用它而不是int

所以這:

WaypointClass(int lt, int lg)
{
    latitude = lt;
    longitude = lg;
}

變成這個:

WaypointClass(float lt, float lg)
    : latitude(lt)
    , longitude(lg)
{}

如果使用向量,則不需要WaypointList類。

在這里,有一些參考: http : //en.cppreference.com/w/cpp/container/vector

我想我會略有不同。 我將使用std::vector來包含航路點列表。 如果您使用的是C ++ 11(為什么不呢?),則可以定義一個構造函數以直接接受括號括起來的初始化程序列表。 完整的程序演示如何執行此操作:

#include <algorithm>
#include <initializer_list>
#include <iostream>
#include <vector>

class WaypointClass
{
private:
    float latitude, longitude;
public:
    WaypointClass(float lt, float lg) : latitude(lt), longitude(lg) {}
    friend std::ostream& operator<<(std::ostream &out, const WaypointClass &wp) 
    {
        return out << "( " << wp.latitude << ", " << wp.longitude << ')';
    }
};

class WaypointList
{
private:
    std::vector<WaypointClass> m_vector;
public:
    WaypointList(std::initializer_list<const WaypointClass> w) 
        : m_vector(w.begin(), w.end()) {}
    friend std::ostream &operator<<(std::ostream &out, const WaypointList &wl) {
        for (const auto &wp : wl.m_vector) 
            out << wp << '\n';
        return out;
    }
};

int main() 
{
    WaypointList myWaypoints{ WaypointClass(1, 2), WaypointClass(3, 4), 
        WaypointClass(5, 6) };
    std::cout << myWaypoints << '\n';

}

如預期的那樣,將打印:

( 1, 2)
( 3, 4)
( 5, 6)

當然,您需要向類中添加更多內容以使其真正有用,但這說明了這些概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM