【问题标题】:Static vector resize静态矢量调整大小
【发布时间】:2012-02-03 18:28:57
【问题描述】:

我想在一个类中创建一个静态向量,并且我想在创建向量时调整它们的大小。我正在尝试在构造函数或主函数中执行此操作。但我无法让它工作。问题是我不能以这种方式调用向量类的函数。 这就是我现在拥有的:

#include <vector>

using namespace std;

class test
{
public:
    static vector<int> testvec;
    test();
};

test::test() //Not static
{
    test::testvec.resize(0);    //Try 1
}

vector<int> test::testvec.resize(0); //Try 2

int main()
{
    test::testvec.resize(0); //Try 3
    test testclass;


    system("pause");
    return false;

}

我需要处理每个对象中向量上的所有数据,这就是我想让向量静态的原因。

有人可以帮我解决这个问题吗? 谢谢!

编辑:语法。我尝试过的每种方法都会出现编译错误。

【问题讨论】:

  • 你确定你的方法真的是最好的吗?如果您在某个时候需要两组独立的test 对象怎么办? shared_ptr 解决方案可能更好。 (静态数据有时可能很好,但它应该是 const 或至少类似于 const;即一个对象所做的永远不会给其他对象造成问题,但将大小调整为 0 看起来很容易出现问题。)
  • 您需要转发声明静态变量。在 Try 1 中没有静态构造函数。在 Try 2 中,您不能全局调用静态成员的方法。在 Try 3 中,您将调用 .resize(0) 两次。如果您想在构造函数中使用clear(),则可能不需要静态成员。也不要从 main 中返回 bool 并避免 system
  • @AJG85: 你需要define 静态变量(好吧,所有变量,只是非外部声明也将是大多数其他类型变量的定义)。您不能转发声明任何变量。
  • @DavidRodríguez-dribeas 是的,我的术语是错误的。

标签: c++ vector constructor resize main


【解决方案1】:

当你声明一个静态成员属性时,你还需要定义它:

class test {
public:
   static std::vector<int> v; // declaration
};
std::vector<int> test::v; // definition, note: no `static` here

您可以选择对构造函数使用大小,这样可以避免调整大小:

std::vector<int> test::v( 10 ); // definition, create it with size==10

但如果您愿意,您仍然可以从 main 调用 resize:

int main() { 
   test::v.resize( 20 );
}

【讨论】:

    【解决方案2】:

    你需要在实现文件中定义静态成员。

    就像在 main.cpp 中:

    vector<int> Test::testvec;
    
    int main() {
     ...
    }
    

    【讨论】:

    • 该上下文中的 static 关键字具有不同的含义,应该删除。
    • 其实你不会在前向声明中重复static关键字。
    • @AJG85:那是不是前向声明,它是静态成员的定义。类中的static vector&lt;int&gt; testvec; 行只是一个声明,而不是一个定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多