gpt4 book ai didi

c++ - 如何使子类与 C++ 中的父类互换?

转载 作者:行者123 更新时间:2023-11-30 02:46:01 31 4
gpt4 key购买 nike

我正在尝试做一个 C++ 练习,它由测试代码 (main.cpp) 和头文件 (vcvec.h) 组成。 测试代码应该保持不变,而包含的头文件应该满足测试代码(这是我必须从头开始编写的)。

在本练习中,我必须通过继承对 std::vector 进行扩展。我设法解决了这个练习的大部分问题,现在,我将只在下面附上相关部分的代码。

main.cpp(测试代码)

#include <string>
#include "vcvec.h"

int main()
{
version_controlled_vector<unsigned int> v;
version_controlled_vector<std::string> a;

v.push_back( 1 );
a.push_back("C++");

std::vector<std::vector<std::string> > hista = a;
std::vector<std::vector<int> > histv = v;
}

vcvec.h

#ifndef VCVEC_H
#define VCVEC_H

#include <vector>

template<class T>
class version_controlled_vector : public std::vector<T>
{
private:
std::vector<std::vector<T>> history;
};

#endif // VCVEC_H

此代码生成以下编译错误:

main.cpp: In function ‘int main()’:
main.cpp:12:52: error: conversion from ‘version_controlled_vector<std::basic_string<char> >’ to non-scalar type ‘std::vector<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >, std::allocator<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > > >’ requested
std::vector<std::vector<std::string> > hista = a;
^
main.cpp:13:44: error: conversion from ‘version_controlled_vector<unsigned int>’ to non-scalar type ‘std::vector<std::vector<int> >’ requested
std::vector<std::vector<int> > histv = v;
^

如何将 version_controlled_vector 的实例分配给 std::vector 类型?我能想到的唯一解决方案是一个合适的复制构造函数,但它应该发生在 std::vector 类中,所以它不是一个选项。

最佳答案

这些是我能想到的选项:

  1. 提供一个返回私有(private)数据引用的函数。

    template<class T>
    class version_controlled_vector : public std::vector<T>
    {
    std::vector<std::vector<T>> const& getHistory() {return history;} const
    private:
    std::vector<std::vector<T>> history;
    };

    然后,在客户端代码中,使用:

    std::vector<std::vector<std::string> > hista = a.getHistory();
  2. 提供自动转换运算符函数

    template<class T>
    class version_controlled_vector : public std::vector<T>
    {
    public:
    operator std::vector<std::vector<T>> const& () {return history;} const
    private:
    std::vector<std::vector<T>> history;
    };

    然后,在客户端代码中,使用:

    std::vector<std::vector<std::string> > hista = a;
  3. 将数据公开以便其他人可以直接使用(不推荐)

    std::vector<std::vector<std::string> > hista = a.history;

更新,回应 OP 的评论

我不确定您的文件是什么样的,但是当将以下代码放入一个 .cc 文件中时,它会为我编译和构建。

#include <vector>

template<class T>
class version_controlled_vector : public std::vector<T>
{
public:

operator std::vector<std::vector<T> > const& () {return history;}

private:

std::vector<std::vector<T> > history;
};

#include <string>

int main()
{
version_controlled_vector<unsigned int> v;
version_controlled_vector<std::string> a;

v.push_back( 1 );
a.push_back("C++");

std::vector<std::vector<std::string> > hista = a;
std::vector<std::vector<unsigned int> > histv = v;
}

关于c++ - 如何使子类与 C++ 中的父类互换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23918519/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com