2016-02-26 31 views
1

我有一個C++/CX的問題。我試圖創建一個實際上是其他Class的集合的類。該類這裏聲明在頭文件:C++/CX否合適的拷貝構造函數

#pragma once 
namespace AdeptlyAdaptiveLayout 
{ 

    public ref class NewsItem sealed 
    { 
    public: 
    NewsItem(int init_Id, Platform::String^ init_Category, Platform::String^ init_Headline, Platform::String^ init_Subhead, Platform::String^ init_DateLine, Platform::String^ Image); 
    property int Id; 
    property Platform::String^ Category; 
    property Platform::String^ Headline; 
    property Platform::String^ Subhead; 
    property Platform::String^ DateLine; 
    property Platform::String^ Image; 
    }; 

    public ref class NewsItemCollection sealed 
    { 
    public: 
    Platform::Collections::Vector<NewsItem> getNewsItems(); 
    }; 
} 

,這是源文件

#include "pch.h" 
#include "NewsItem.h" 

using namespace Platform; 
using namespace Platform::Collections; 

namespace AdeptlyAdaptiveLayout 
{ 
    NewsItem::NewsItem(int init_Id, 
     String^ init_Category, 
     String^ init_Headline, 
     String^ init_Subhead, 
     String^ init_DateLine, 
     String^ init_Image) 
    { 
     Id = init_Id; 
     Category = init_Category; 
     Headline = init_Headline; 
     Subhead = init_Subhead; 
     DateLine = init_DateLine; 
     Image = init_Image; 
    } 

    Vector<NewsItem> NewsItemCollection::getNewsItems() 
    { 
     Vector<NewsItem> temp; 

     temp.Append(*ref new NewsItem(1, "Financial", "Lorem Ipsum", "doro sit amet", "Nunc tristique nec", "Assets/Financial1.png")); 
     temp.Append(*ref new NewsItem(2, "Financial", "Etiam ac felis viverra", "vulputate nisl ac, aliquet nisi", "tortor porttitor, eu fermentum ante congue", "Assets/Financial2.png")); 
     temp.Append(*ref new NewsItem(3, "Financial", "Integer sed turpis erat", "Sed quis hendrerit lorem, quis interdum dolor", "in viverra metus facilisis sed", "Assets/Financial3.png")); 
     temp.Append(*ref new NewsItem(4, "Financial", "Proin sem neque", "aliquet quis ipsum tincidunt", "Integer eleifend", "Assets/Financial4.png")); 
     temp.Append(*ref new NewsItem(5, "Financial", "Mauris bibendum non leo vitae tempor", "In nisl tortor, eleifend sed ipsum eget", "Curabitur dictum augue vitae elementum ultrices", "Assets/Financial5.png")); 

     temp.Append(*ref new NewsItem(6, "Food", "Lorem ipsum", "dolor sit amet", "Nunc tristique nec", "Assets/Food1.png")); 
     temp.Append(*ref new NewsItem(7, "Food", "Etiam ac felis viverra", "vulputate nisl ac, aliquet nisi", "tortor porttitor, eu fermentum ante congue", "Assets/Food2.png")); 
     temp.Append(*ref new NewsItem(8,"Food", "Integer sed turpis erat", "Sed quis hendrerit lorem, quis interdum dolor", "in viverra metus facilisis sed","Assets/Food3.png")); 
     temp.Append(*ref new NewsItem(9, "Food","Proin sem neque", "aliquet quis ipsum tincidunt", "Integer eleifend", "Assets/Food4.png")); 
     temp.Append(*ref new NewsItem(10, "Food", "Mauris bibendum non leo vitae tempor", "In nisl tortor, eleifend sed ipsum eget", "Curabitur dictum augue vitae elementum ultrices", "Assets/Food5.png")); 

     return temp; 
    } 

} 

的問題是,我一直有這個錯誤消息「類‘AdeptlyAdaptiveLayout :: NewsItem’沒有合適的拷貝構造函數「。我不知道我做錯了什麼。你們能給我一個線索嗎?

+0

當你只是想對象爲什麼用'裁判new',爲什麼不這樣做'temp.Append(NewsItem(...))'直接? –

+0

至於你的問題,我不知道C++/CX的細節,但似乎編譯器不能爲類生成一個默認的隱式拷貝構造函數,你需要顯式地創建一個拷貝構造函數。當向「Append」函數傳遞一個對象時,如果編譯器無法創建該副本,則會將一個*副本*存儲在該向量中,那麼您將得到一個類似您所擁有的錯誤。 –

回答

0

好的,我現在找到了答案。我已經將類型從Vector更改爲IVector,顯式創建複製構造函數,並在實現中添加一些更改。以下是標題和源代碼中已更改的代碼。

頁眉:

namespace AdeptlyAdaptiveLayout 
{ 

    public ref class NewsItem sealed 
    { 
    public: 
     NewsItem(int init_Id, Platform::String^ init_Category, Platform::String^ init_Headline, Platform::String^ init_Subhead, Platform::String^ init_DateLine, Platform::String^ Image); 
     NewsItem(NewsItem^ obj); 
     property int Id; 
     property Platform::String^ Category; 
     property Platform::String^ Headline; 
     property Platform::String^ Subhead; 
     property Platform::String^ DateLine; 
     property Platform::String^ Image; 
    }; 

    public ref class NewsItemCollection sealed 
    { 
    public: 
     Windows::Foundation::Collections::IVector<NewsItem^>^ getNewsItems(); 
    }; 
} 

來源:

#include "pch.h" 
#include "NewsItem.h" 

using namespace Platform; 
using namespace Platform::Collections; 
using namespace Windows::Foundation::Collections; 

namespace AdeptlyAdaptiveLayout 
{ 
    NewsItem::NewsItem(int init_Id, 
     String^ init_Category, 
     String^ init_Headline, 
     String^ init_Subhead, 
     String^ init_DateLine, 
     String^ init_Image) 
    { 
     Id = init_Id; 
     Category = init_Category; 
     Headline = init_Headline; 
     Subhead = init_Subhead; 
     DateLine = init_DateLine; 
     Image = init_Image; 
    } 

    NewsItem::NewsItem(NewsItem^ obj) 
    { 
     this->Category = obj->Category; 
     this->DateLine = obj->DateLine; 
     this->Headline = obj->Headline; 
     this->Id = obj->Id; 
     this->Image = obj->Image; 
     this->Subhead = obj->Subhead; 
    } 

    IVector<NewsItem^>^ NewsItemCollection::getNewsItems() 
    { 
     IVector<NewsItem^>^ temp = ref new Vector<NewsItem^>(); 

     temp->Append(ref new NewsItem(1, "Financial", "Lorem Ipsum", "doro sit amet", "Nunc tristique nec", "Assets/Financial1.png")); 
     temp->Append(ref new NewsItem(2, "Financial", "Etiam ac felis viverra", "vulputate nisl ac, aliquet nisi", "tortor porttitor, eu fermentum ante congue", "Assets/Financial2.png")); 
     temp->Append(ref new NewsItem(3, "Financial", "Integer sed turpis erat", "Sed quis hendrerit lorem, quis interdum dolor", "in viverra metus facilisis sed", "Assets/Financial3.png")); 
     temp->Append(ref new NewsItem(4, "Financial", "Proin sem neque", "aliquet quis ipsum tincidunt", "Integer eleifend", "Assets/Financial4.png")); 
     temp->Append(ref new NewsItem(5, "Financial", "Mauris bibendum non leo vitae tempor", "In nisl tortor, eleifend sed ipsum eget", "Curabitur dictum augue vitae elementum ultrices", "Assets/Financial5.png")); 

     temp->Append(ref new NewsItem(6, "Food", "Lorem ipsum", "dolor sit amet", "Nunc tristique nec", "Assets/Food1.png")); 
     temp->Append(ref new NewsItem(7, "Food", "Etiam ac felis viverra", "vulputate nisl ac, aliquet nisi", "tortor porttitor, eu fermentum ante congue", "Assets/Food2.png")); 
     temp->Append(ref new NewsItem(8,"Food", "Integer sed turpis erat", "Sed quis hendrerit lorem, quis interdum dolor", "in viverra metus facilisis sed","Assets/Food3.png")); 
     temp->Append(ref new NewsItem(9, "Food","Proin sem neque", "aliquet quis ipsum tincidunt", "Integer eleifend", "Assets/Food4.png")); 
     temp->Append(ref new NewsItem(10, "Food", "Mauris bibendum non leo vitae tempor", "In nisl tortor, eleifend sed ipsum eget", "Curabitur dictum augue vitae elementum ultrices", "Assets/Food5.png")); 

     return temp; 
    } 

} 

不過,我仍然不明白爲什麼它的工作原理。我想我會對此做一個深入的研究。

0

當您使用此構造函數簽名提供的構造函數:

NewsItem(int init_Id, Platform::String .... 

...編譯器將不再合成的默認構建函數爲您服務。在這種情況下,您現在需要自己指定它們。

https://msdn.microsoft.com/en-us/library/s16xw1a8.aspx

如果所有非默認的構造函數聲明,編譯器不 提供一個默認的構造函數

+0

鏈接和規則適用於C++和C++類。這對C++/CX引用類也是如此嗎? – IInspectable

+0

是的。行爲是一致的。我相信GCC和GCC變種也是如此,但我現在無法測試......我有一個8周大的孩子睡在我的腿上。 – gdc

+0

我不認爲GCC實現C++/CX。你有參考嗎? – IInspectable