C++项目开发遇到的问题

看下面的代码:

class configbase {
public:
    configbase(const string& name, const string& description) : m_name(name), m_description(description) {}
    virtual void configd(const string& name, const string& dec);
    virtual ~configbase();

protected:
    string m_name;
    string m_description;
};

template<class T>
class config : public configbase {
public:
    config(const string& name, const string& description) : configbase(name, description) {}

    using ptr = std::shared_ptr<config>;

    void bins(const T& val) {}

    void configd(const string& name, const string& val) override {
        m_name = name;
        m_description = val;
    }
};

int main(){
	
	return 0;
}

这段代码没有问题。
但是下面的就存在问题:

    class ConfigVarBase{
    public:
        using ptr = std::shared_ptr<ConfigVarBase>;
        // 记录信息的名字和描述
        ConfigVarBase(const std::string& name,
                    const std::string& description = "")
                    :m_name(name),
                    m_description(description)
                    {
                        // 统一转换成小写
                        std::transform(m_name.begin(),
                            m_name.end(),
                            m_name.begin(),
                            ::tolower
                        );
                    }
        virtual ~ConfigVarBase(){}
        const std::string& getName() const {return m_name;}
        const std::string& getDescription()const{return m_description;}

        virtual std::string toString();//{return "";}
        virtual bool fromString(const std::string& val);//{ return true;}
        // 拿到信息的类型名字
        virtual std::string getTypename()const;//{return "";}
        protected:
            std::string m_name;
            std::string m_description;
    };
    // 根据不同的类型进行构建信息对象
    template<class T>
    class configvar:public ConfigVarBase{
    public:
        using ptr = std::shared_ptr<configvar>;
        configvar(
        const std::string& name,
        const T& default_value,
        const std::string& descriiption="" 
        ):ConfigVarBase(name, descriiption){
            m_val = default_value;
        }
        ~configvar(){}
        // 将信息转换成字符串
        std::string toString()override{
            try
            {
                return boost::lexical_cast<std::string>(m_val);
            }
            catch(const std::exception& e)
            {
                SYLAR_LOG_ERROR(SYLAR_LOG_ROOT())<<"configvar::tostring exception"
                << e.what()<<"convert:"<<typeid(m_val).name()<<"to string";
                // std::cerr << e.what() << '\n';
            }
            return "";
        }
        // 将字符串转化成信息,并返回转化的结果
        bool fromString(const std::string& val)override{
            try
            {
                m_val = boost::lexical_cast<T>(val);
                return true;
            }
            catch(const std::exception& e)
            {
                SYLAR_LOG_ERROR(SYLAR_LOG_ROOT())<<"configvar::fromstring exception"
                <<e.what()<<"convert:string to"<<typeid(m_val).name();
            }
            return false;
        }
        T getValue()const{return m_val;}
        std::string getTypename()const override{
            // 对T变成字符串
            return "";
        }
        void setValue(const T& value)const{m_val = value;}
        private:
            T m_val;
    };

如果说我将基类中的虚函数进行空实现,此时就没有问题。第一段代码没有做成动态库。第二个是做成了动态库的代码。
错误信息:

Undefined symbols for architecture arm64:
  "typeinfo for sylar::ConfigVarBase", referenced from:
      std::__1::shared_ptr<sylar::configvar<int> > std::__1::dynamic_pointer_cast[abi:v15006]<sylar::configvar<int>, sylar::ConfigVarBase>(std::__1::shared_ptr<sylar::ConfigVarBase> const&) in test_config.cpp.o
      typeinfo for sylar::configvar<int> in test_config.cpp.o
  "vtable for sylar::ConfigVarBase", referenced from:
      sylar::ConfigVarBase::ConfigVarBase(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in test_config.cpp.o
      sylar::ConfigVarBase::~ConfigVarBase() in test_config.cpp.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [/Users/al/Desktop/C++/workspace/bin/test_config] Error 1
make[1]: *** [CMakeFiles/test_config.dir/all] Error 2
make: *** [all] Error 2

待解决!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: c语言是一种通用、高效、结构化的编程语言,其代码简洁、可读性强,在计算机领域被广泛应用。本着开发实战的目的,我们需要掌握c语言的基本语法,具体步骤如下: 1.学习c语言的基础语法,包括数据类型、变量、常量、运算符、控制语句、数组等。此外还需了解指针的用法,掌握指针与数组的关系,熟悉函数的定义和调用,以及函数与指针的关系。 2.进行实际项目开发,可以选择简单的小项目作为练手,如计算器、2048小游戏等。这些项目不仅可以熟悉基本语法,还可以练习逻辑思维和问题解决能力。 3.在项目实践过程中,我们需要重视程序的可读性、可维护性和可扩展性。要注重模块化的思想,将程序分割成若干个小模块,功能单一、清晰易懂,方便日后的调试和优化。 4.在开发过程中,需要熟练使用调试工具和调试技巧,排除程序中的错误和漏洞,提高代码的质量和效率。 5.学习代码规范和代码注释的方法,保证代码的可读性和易维护性。合理使用注释,可以帮助别人更好地理解和使用我们的代码。 总之,要熟练掌握c语言的基本语法和常用函数,注重项目实践,注重程序的可读性和可维护性,这样才能让我们更好地掌握和应用c语言,提高自己的编程水平。 ### 回答2: C语言是一门非常流行的编程语言,是许多编程语言的基础之一,因此学习它对于想要深入了解编程的人来说是非常有用的。C项目开发实战入门会涵盖基础的C语言语法以及如何将其应用在实际项目中。在学习过程中,你将学习如何使用不同的编译器、链接器和调试器,以及如何使用不同的工具来管理你的代码库和版本控制。学习C语言的开发项目,还会包括如何使用命令行工具、编写Makefile文件,以及如何在Linux上编译和调试代码等方面。 在这个项目开发实战入门的学习过程中,你将会遇到一些挑战。首先,你需要理解C语言中变量、数据类型、控制结构和函数等基础语法。你还需要学习如何处理指针,这是C语言中非常重要的概念。此外,你还需要学习如何使用C语言中的库函数,例如标准库、数学库和字符串库,以及如何在自己的代码中使用它们。 最后,你将学习如何将你的C代码编译为可执行文件,并且如何使用调试器来查找和解决代码中的问题。你还将学习如何将你的代码提交到代码库,并且如何使用版本控制工具来管理你的代码的更改。 总之,C项目开发实战入门是一门非常有用的课程,它将为你提供了解C语言的基础知识和在实际项目中应用这些知识的机会。学习后你会能够编写C项目的代码,并且知道如何使用不同的工具来管理你的项目。 ### 回答3: 首先,项目开发实战入门需要掌握一定的编程技术和开发工具,例如掌握基础的编程语言,如C/C++Java等,并熟练使用开发工具,如Eclipse、Visual Studio等。其次,需要了解项目开发的流程和方法,包括需求分析、项目计划、设计、编码、测试、发布等各个阶段。这些阶段都需要严格按照项目计划和需求书进行控制,以确保项目的顺利实施和达到预期目标。此外,还需要注意对开源社区的贡献,例如提交代码、解决问题等,以增强自己的交流能力和技术实力。最后,项目开发实战入门也需要注意对项目文档的管理和维护,以便于日后维护和知识沉淀。需要制定合理的文档管理规划,包括对文档的编写、归档和备份等,以确保项目的持续稳定。总之,项目开发实战入门需要全面掌握项目开发的技术和知识,包括编程技术、开发工具、流程方法、贡献社区、文档管理等,以实现顺利的项目开发和实现预期目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值