找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
請尊重及感激所有版主付出和奉獻發表文章前請先閱讀相關版規尊貴會員無限看帖不用回覆
人妻銀魂母乳mggd國中kkbox
安卓尋找愛麗snis 949爆乳ceo慶餘ai 換臉kittyxku

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 1362|回復: 7
打印上一主題下一主題

[問題]"&operator=" 校正[複製鏈接]

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
487
積分
11596 點
潛水值
28679 米
跳轉到指定樓層
樓主
發表於 2011-1-17 05:58 PM|只看該作者|倒序瀏覽
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。
本帖最後由 玉鹿 於 2011-1-17 06:02 PM 編輯

抱著一點點希望看看有沒有人可以幫我><問題一:
&operator= 有沒有寫錯
問題二:
要怎麼把&operator=分到newBag.cpp裡面?

  1. //newBag.h
  2. #ifndef bag_H
  3. #define bag_H

  4. #include <iostream>
  5. #include <string>

  6. typedef std::string ItemType;

  7. class Bag
  8.     {
  9.       public:
  10.         Bag();
  11.                 ~Bag();
  12.                 Bag &operator=(const Bag &old)
  13.                 {
  14.                         if(&old == this)
  15.                                 return (*this);
  16.                         delete [] m_container;
  17.                         m_number = old.m_number;
  18.                         m_container = new ItemType[m_number];
  19.                         for (int i = 0; i < m_number; i++)
  20.                         {
  21.                                 m_container[i] = old.m_container[i];
  22.                         }
  23.                         return (*this);
  24.                 }
  25.         bool empty() const;
  26.         int size();
  27.         int uniqueSize();
  28.         bool insert(const ItemType& value);
  29.         int erase(const ItemType& value);
  30.         int eraseAll(const ItemType& value);
  31.         bool contains(const ItemType& value) const;
  32.         int count(const ItemType& value) const;
  33.         void swap(Bag& other);
  34.         void start();
  35.         void next();
  36.         bool ended() const;
  37.         const ItemType& currentValue() const;
  38.         int currentCount() const;
  39.                 void display(); //delete this
  40.          private:
  41.                 ItemType* m_container;
  42.                 ItemType* m_distinct;
  43.                 int m_number;
  44.      };
  45. #endif
複製代碼
  1. //newbag.cpp
  2. #include "newBag.h"
  3. using namespace std;
  4. Bag::Bag(): m_distinct(NULL), m_container(NULL), m_number(0) {}          // Create an empty bag.
  5. Bag::~Bag()
  6. {
  7.         delete [] m_container;
  8. }
  9. bool Bag::empty() const // Return true if the bag is empty, otherwise false.
  10. {
  11.         if (m_number == 0)
  12.                 return true;
  13.         return false;
  14. }
  15. int Bag::size()
  16. {
  17. // Return the number of items in the bag.  For example, the size
  18. // of a bag containing "cumin", "cumin", "cumin", "turmeric" is 4.
  19.         return m_number;
  20. }
  21. int Bag::uniqueSize()
  22. {
  23. // Return the number of distinct items in the bag.  For example,
  24. // the uniqueSize of a bag containing "cumin", "cumin", "cumin",
  25. // "turmeric" is 2.
  26.         int u = 0;
  27.         ItemType* pointer = new ItemType[m_number];
  28.         for (int x = 0;x < m_number; x++)
  29.         {
  30.                 pointer[x] = m_container[x];
  31.         }
  32.         ItemType unique;
  33.         bool next = true;
  34.         for (int x = 0; x < m_number; x++)
  35.         {
  36.                 next = true;
  37.                 unique = pointer[x];
  38.                 for( int y = 0; y < m_number; y++)
  39.                 {
  40.                         if (unique == "")
  41.                         {
  42.                                 u++;
  43.                         }
  44.                         else if (unique == pointer[y])// && unique != ""
  45.                         {
  46.                                 pointer[y] = "";
  47.                         }
  48.                         else if(next == true)//unique != pointer[y] && unique != "" &&
  49.                         {
  50.                                 next = false;
  51.                                 x = y-1;
  52.                                 u++;
  53.                         }
  54.                 }
  55.         }
  56.         delete [] pointer;
  57.         return u;
  58. }
  59. bool Bag::insert(const ItemType& value)
  60. {
  61. // Insert value into the bag.  Return true if the value was
  62. // actually inserted.  Return false if the value was not inserted
  63. // (perhaps because the bag has a fixed capacity and is full).
  64.         int i = m_number;
  65.         if ( ++i < 200)
  66.         {
  67.                 m_number++;
  68.                 ItemType* pointer = new ItemType[m_number];
  69.                 pointer [0] = value;
  70.                 for( int x = 0; x < m_number -1; x++)
  71.                 {
  72.                         pointer[x+1] = m_container[x];
  73.                 }
  74.                 delete [] m_container;
  75.                 m_container = pointer;
  76.                 return true;
  77.         }
  78.         return false;
  79. }
  80. int Bag::erase(const ItemType& value)
  81. {
  82. // Remove one instance of value from the bag if present.
  83. // Return the number of instances removed, which will be 1 or 0.
  84.         int z = 0;
  85.         for (int i = 0; i < m_number; i++)
  86.         {
  87.                 if (m_container [i] != value)
  88.                 {
  89.                         z++;
  90.                 }
  91.         }
  92.         if ((z+1) == m_number)
  93.         {
  94.                 return 0;
  95.         }
  96.         int number_erased = 0;
  97.         bool deleted = false;
  98.         m_number --;
  99.         ItemType * pointer = new ItemType [m_number -1];
  100.         int y = 0;
  101.         for (int x = 0; x < m_number; x++)
  102.         {
  103.                 if (m_container[x] == value && deleted == false)
  104.                 {
  105.                         deleted = true;
  106.                 }
  107.                 else
  108.                 {
  109.                         pointer [y] = m_container [x];
  110.                         y++;
  111.                 }
  112.         }
  113.         delete [] m_container;
  114.         m_container = pointer;
  115.         return 1;
  116. }
  117. int Bag::eraseAll(const ItemType& value)
  118. {
  119. // Remove all instances of value from the bag if present.
  120. // Return the number of instances removed.
  121.         int z = 0;
  122.         for (int i = 0; i < m_number; i++)
  123.         {
  124.                 if (m_container [i] == value)
  125.                 {
  126.                         z++;
  127.                 }
  128.         }
  129.         z++;
  130.         int y = 0;
  131.         for( int x = 0; x < z; x++)
  132.         {
  133.                 erase(value);
  134.         }
  135.         z--;
  136.         return z;
  137. }
  138. bool Bag::contains(const ItemType& value) const
  139. {
  140. // Return true if the value is in the bag, otherwise false.
  141.         for (int x = 0; x < m_number; x++)
  142.         {
  143.                 if (m_container [x] == value)
  144.                         return true;
  145.         }
  146.         return false;
  147. }
  148. int Bag::count(const ItemType& value) const
  149. {
  150. // Return the number of instances of value in the bag.
  151.         int z = 0;
  152.         for (int x = 0; x < m_number; x++)
  153.         {
  154.                 if (m_container [x] == value)
  155.                         z++;
  156.         }
  157.         return z;

  158. }

  159. void Bag::swap(Bag& other)
  160. {
  161. // Exchange the contents of this bag with the other one.
  162.                 Bag temp(other);
  163.                 other = *this;
  164.                 *this = temp;
  165. }

  166. // Iteration functions (explained below)
  167. void Bag::start()
  168. {
  169.         if (m_distinct != NULL)
  170.                 m_distinct = m_container;
  171.         else
  172.                 m_distinct = NULL;
  173. }
  174. void Bag::next()
  175. {
  176.         ItemType old = *m_distinct;
  177.         Bag a;
  178.         if (m_distinct = NULL)
  179.         {
  180.                 m_distinct = NULL;
  181.         }
  182.         else
  183.         {               
  184.                 for (int x = 0; x < m_number; x++)
  185.                 {
  186.                         if (m_container [x] != *m_distinct && a.contains(m_container[x]) == false)
  187.                         {
  188.                                 a.insert(m_container[x]);
  189.                                 m_distinct = &m_container[x];
  190.                                 break;
  191.                         }
  192.                 }
  193.         }
  194.                           
  195.         if (old == *m_distinct)
  196.         {
  197.                 m_distinct = NULL;
  198.         }
  199. }
  200. bool Bag::ended() const
  201. {
  202.         if (m_distinct == NULL)
  203.                 return true;
  204.         return false;
  205. }
  206. const ItemType& Bag::currentValue() const
  207. {
  208.         return *m_distinct;
  209. }
  210. int Bag::currentCount() const
  211. {        
  212.         return count(*m_distinct);
  213. }
  214. void Bag::display()
  215. {
  216.         for(int x = 0; x < m_number; x++)
  217.         {
  218.                 std:: cout << m_container[x] << std::endl;
  219.         }
  220. }
複製代碼
  1. //testnewbag.cpp

  2. #include "newBag.h"
  3. #include <iostream>
  4. #include <assert.h>
  5. using namespace std;

  6. int main()
  7. {
  8.         cout << "b1:" << endl;
  9.         Bag b1;
  10.     b1.insert("cumin");
  11.     b1.insert("cumin");
  12.     b1.insert("turmeric");
  13.         b1.display();
  14.         cout << "b2" << endl;
  15.     Bag b2;
  16.     b2.insert("saffron");
  17.     b2.insert("cumin");
  18.     b2.insert("cinnamon");
  19.         b2.display();
  20.     b1.swap(b2);  // exchange contents of b1 and b2
  21.         cout << "b1:" << endl;
  22.         b1.display();
  23.         cout << "b2:" << endl;
  24.         b2.display();
  25. }
複製代碼
...
瀏覽完整內容,請先 註冊登入會員
分享分享0收藏收藏0支持支持0

使用道具檢舉

Rank: 3Rank: 3Rank: 3

帖子
722
積分
2721 點
潛水值
16557 米
頭香
發表於 2011-1-17 06:16 PM|只看該作者
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
.h
  1. Bag& operator=(const Bag &old);
複製代碼
.cpp
  1. Bag& Bag::operator=(const Bag &old)
  2. {
  3.     if(&old == this)
  4.         return (*this);
  5.     delete [] m_container;
  6.     m_number = old.m_number;
  7.     m_container = new ItemType[m_number];
  8.     for (int i = 0; i < m_number; i++)
  9.     {
  10.         m_container[i] = old.m_container[i];
  11.     }
  12.     return (*this);
  13. }
複製代碼
...
瀏覽完整內容,請先 註冊登入會員
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。

使用道具檢舉

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
487
積分
11596 點
潛水值
28679 米
3
發表於 2011-1-18 02:27 AM|只看該作者
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。
回復
下載: 訪客無法瀏覽下載點,請先 註冊登入會員
kaworucloud


謝了, 不過這個程式好像是錯誤的,
swap還是沒辦法作業
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
487
積分
11596 點
潛水值
28679 米
4
發表於 2011-1-18 02:47 AM|只看該作者
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。
本帖最後由 玉鹿 於 2011-1-18 02:49 AM 編輯

回復
下載: 訪客無法瀏覽下載點,請先 註冊登入會員
kaworucloud


剛剛發現問題好像是因為pointer 複製上的問題,
請問大大知道嗎?

使用道具檢舉

Rank: 3Rank: 3Rank: 3

帖子
722
積分
2721 點
潛水值
16557 米
5
發表於 2011-1-18 11:17 AM|只看該作者
會出錯是因為你的 swap 中用到了你沒定義的 copy constructor
解決方式有兩個
一是修改 sawp,別用 copy constructor,只用 assignment operator
  1. void swap( Bag& other ){
  2.    //Bag temp(other); 這會呼叫 copy constructor
  3.    //Bag temp = other; 這也會呼叫 copy constructor
  4.     Bag temp;
  5.     temp = other; // 這會呼叫 =operator
  6.     other = *this;
  7.     *this = temp;
  8. }
複製代碼
二是定義 copy constructor
.h
  1. Bag( const Bag& other );
複製代碼
.cpp
  1. Bag::Bag( const Bag& other ){
  2.     m_number = other.m_number;
  3.     m_container = new ItemType[m_number];
  4.     for( int i=0; i<m_number; ++i ){
  5.         m_container[i] = other.m_container[i];
  6.     }
  7. }
複製代碼
...
瀏覽完整內容,請先 註冊登入會員





使用道具檢舉

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
487
積分
11596 點
潛水值
28679 米
6
發表於 2011-1-23 06:29 PM|只看該作者
公布答案:
  1. // newBag.h

  2. #ifndef NEWBAG_INCLUDED
  3. #define NEWBAG_INCLUDED

  4.   // Later in the course, we'll see that templates provide a much nicer
  5.   // way of enabling us to have Bags of different types.  For now, we'll
  6.   // use a typedef.

  7. typedef unsigned long ItemType;

  8. const int DEFAULT_MAX_ITEMS = 200;

  9. class Bag
  10. {
  11.   public:
  12.     Bag(int capacity = DEFAULT_MAX_ITEMS);
  13.       // Create an empty bag with the given capacity.

  14.     bool empty() const;  // Return true if the bag is empty, otherwise false.

  15.     int size() const;
  16.       // Return the number of items in the bag.  For example, the size
  17.       // of a bag containing "cumin", "cumin", "cumin", "turmeric" is 4.

  18.     int uniqueSize() const;
  19.       // Return the number of distinct items in the bag.  For example,
  20.       // the uniqueSize of a bag containing "cumin", "cumin", "cumin",
  21.       // "turmeric" is 2.

  22.     bool insert(const ItemType& value);
  23.       // Insert value into the bag.  Return true if the value was
  24.       // actually inserted.  Return false if the value was not inserted
  25.       // (perhaps because the bag has a fixed capacity and is full).

  26.     int erase(const ItemType& value);
  27.       // Remove one instance of value from the bag if present.
  28.       // Return the number of instances removed, which will be 1 or 0.

  29.     int eraseAll(const ItemType& value);
  30.       // Remove all instances of value from the bag if present.
  31.       // Return the number of instances removed.

  32.     bool contains(const ItemType& value) const;
  33.       // Return true if the value is in the bag, otherwise false.

  34.     int count(const ItemType& value) const;
  35.       // Return the number of instances of value in the bag.

  36.     void swap(Bag& other);
  37.       // Exchange the contents of this bag with the other one.

  38.       // Iteration functions
  39.     void start();                          // start an iteration
  40.     void next();                           // advance to next item
  41.     bool ended() const;                    // iteration has passed end
  42.     const ItemType& currentValue() const;  // item at current position
  43.     int currentCount() const;              // count of current item

  44.       // Housekeeping functions
  45.     ~Bag();
  46.     Bag(const Bag& other);
  47.     Bag& operator=(const Bag& rhs);

  48.   private:

  49.       // Since this structure is used only by the implementation of the
  50.       // Bag class, we'll make it private to Bag.  Alternatively,
  51.       // we could have declared it outside the Bag class, but then
  52.       // clients could use it, and there's no need for them to.

  53.     struct Node
  54.     {
  55.         ItemType m_value;
  56.         int      m_count;
  57.     };
  58.     Node* m_data;       // dynamic array of the items in the bag, with counts
  59.     int   m_uniqueSize; // how many distinct items in the bag
  60.     int   m_size;       // total number of items in the bag
  61.     int   m_capacity;   // the maximum number of items
  62.     int   m_current;    // index of current node during iteration

  63.       // At any time, the elements of m_data indexed from 0 to m_uniqueSize-1
  64.       // are in use.  m_size is the sum of the m_counts of those elements.

  65.     int find(const ItemType& value) const;
  66.       // Return index of the node in m_data whose m_value == value if there is
  67.       // one, else -1

  68.     int doErase(const ItemType& value, bool all);
  69.       // Remove one or all instances of value from the bag if present,
  70.       // depending on the second parameter.  Return the number of instances
  71.       // removed.
  72. };

  73. // Inline implementations

  74. inline
  75. int Bag::size() const
  76. {
  77.     return m_size;
  78. }

  79. inline
  80. int Bag::uniqueSize() const
  81. {
  82.     return m_uniqueSize;
  83. }

  84. inline
  85. bool Bag::empty() const
  86. {
  87.     return size() == 0;
  88. }

  89. inline
  90. int Bag::erase(const ItemType& value)
  91. {
  92.     return doErase(value, false);
  93. }

  94. inline
  95. int Bag::eraseAll(const ItemType& value)
  96. {
  97.     return doErase(value, true);
  98. }

  99. inline
  100. bool Bag::contains(const ItemType& value) const
  101. {
  102.     return find(value) != -1;
  103. }

  104. inline
  105. void Bag::start()
  106. {
  107.     m_current = 0;
  108. }

  109. inline
  110. void Bag::next()
  111. {
  112.     m_current++;
  113. }

  114. inline
  115. bool Bag::ended() const
  116. {
  117.     return m_current >= m_uniqueSize;
  118. }

  119. inline
  120. const ItemType& Bag::currentValue() const
  121. {
  122.     return m_data[m_current].m_value;
  123. }

  124. inline
  125. int Bag::currentCount() const
  126. {
  127.     return m_data[m_current].m_count;
  128. }

  129. #endif // NEWBAG_INCLUDED
複製代碼

  1. // newBag.cpp

  2. #include "newBag.h"
  3. #include <iostream>
  4. #include <cstdlib>
  5. using namespace std;

  6. void exchange(int& a, int& b)
  7. {
  8.     int t = a;
  9.     a = b;
  10.     b = t;
  11. }

  12. Bag::Bag(int capacity)
  13. : m_uniqueSize(0), m_size(0), m_capacity(capacity), m_current(0)
  14. {
  15.     if (capacity < 0)
  16.     {
  17.         cout << "A Bag capacity must not be negative." << endl;
  18.         exit(1);
  19.     }
  20.     m_data = new Node[m_capacity];
  21. }

  22. Bag::Bag(const Bag& other)
  23. : m_uniqueSize(other.m_uniqueSize), m_size(other.m_size),
  24.    m_capacity(other.m_capacity), m_current(other.m_uniqueSize)
  25. {
  26.       // Iterator state in fresh copy is undefined.  Let's say it's ended.
  27.       // Setting m_current above to other.uniqueSize does that.

  28.     m_data = new Node[m_capacity];
  29.     for (int k = 0; k < m_uniqueSize; k++)
  30.         m_data[k] = other.m_data[k];
  31. }

  32. Bag::~Bag()
  33. {
  34.     delete [] m_data;
  35. }

  36. Bag& Bag::operator=(const Bag& rhs)
  37. {
  38.     if (this != &rhs)
  39.     {
  40.         Bag temp(rhs);
  41.         swap(temp);
  42.     }
  43.     return *this;
  44. }

  45. bool Bag::insert(const ItemType& value)
  46. {
  47.     int pos = find(value);

  48.     if (pos != -1)  // found
  49.         m_data[pos].m_count++;
  50.     else
  51.     {
  52.         if (uniqueSize() == m_capacity)  // no room to insert
  53.             return false;
  54.         m_data[m_uniqueSize].m_value = value;
  55.         m_data[m_uniqueSize].m_count = 1;
  56.         m_uniqueSize++;
  57.     }

  58.     m_size++;
  59.     return true;
  60. }

  61. int Bag::count(const ItemType& value) const
  62. {
  63.     int pos = find(value);
  64.     return pos == -1 ? 0 : m_data[pos].m_count;
  65. }

  66. void Bag::swap(Bag& other)
  67. {
  68.       // Swap the m_data pointers to dynamic arrays.

  69.     Node* tempData = m_data;
  70.     m_data = other.m_data;
  71.     other.m_data = tempData;

  72.       // Swap uniqueSize, size, and capacity.

  73.     exchange(m_uniqueSize, other.m_uniqueSize);
  74.     exchange(m_size, other.m_size);
  75.     exchange(m_capacity, other.m_capacity);

  76.       // Iterator state after swap is undefined.  Let's say it's ended.

  77.     m_current = m_uniqueSize;
  78.     other.m_current = other.m_uniqueSize;
  79. }

  80. int Bag::find(const ItemType& value) const
  81. {
  82.       // Do a linear search through the array.

  83.     for (int pos = 0; pos < m_uniqueSize; pos++)
  84.         if (m_data[pos].m_value == value)
  85.             return pos;
  86.     return -1;
  87. }

  88. int Bag::doErase(const ItemType& value, bool all)
  89. {
  90.     int pos = find(value);

  91.     if (pos == -1)  // not found
  92.         return 0;

  93.       // If erasing one, and there are more than one, just decrement

  94.     if (!all  &&  m_data[pos].m_count > 1)
  95.     {
  96.         m_data[pos].m_count--;
  97.         m_size--;
  98.         return 1;
  99.     }

  100.       // If erasing all, or erasing one whose count is 1, move last array
  101.       // item to replace the one to be erased

  102.     int nErased = m_data[pos].m_count;
  103.     m_size -= nErased;
  104.     m_uniqueSize--;
  105.     m_data[pos] = m_data[m_uniqueSize];
  106.     return nErased;
  107. }
複製代碼
...
瀏覽完整內容,請先 註冊登入會員
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
487
積分
11596 點
潛水值
28679 米
7
發表於 2011-1-23 06:31 PM|只看該作者
回復
下載: 訪客無法瀏覽下載點,請先 註冊登入會員
kaworucloud


一定要先做好copy constructor才可以做assignment operator吧?
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

Rank: 3Rank: 3Rank: 3

帖子
722
積分
2721 點
潛水值
16557 米
8
發表於 2011-1-24 09:44 AM|只看該作者
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
回復  kaworucloud

一定要先做好copy constructor才可以做assignment operator吧?
玉鹿 發表於 2011-1-23 06:31 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員



copy constructor 與 assignment operator 是兩個完全不同的東西,彼此沒有絕對的關係
...
瀏覽完整內容,請先 註冊登入會員
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部