You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Compound类添加元素合法性校验的错误处理机制?

实现化合物名称的无效元素校验逻辑

作为编程新手,你可以通过在类的构造函数中嵌入元素校验逻辑来实现需求,核心思路很清晰:先准备好所有有效化学元素符号的集合,在创建Compound对象时,解析输入的化合物名称、提取其中的元素符号,逐一校验有效性——只要发现无效元素,立刻抛出对应异常,阻止对象完成创建。

步骤1:准备有效元素符号集合

先定义一个包含有效化学元素符号的集合(这里只列举常见元素,你可以根据需求补全完整列表),集合的优势是能快速判断元素是否存在:

#include <unordered_set>
#include <string>
#include <stdexcept>
#include <cctype>

// 有效化学元素符号集合,支持O(1)时间复杂度的查找
const std::unordered_set<std::string> valid_elements = {
    "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
    "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca",
    // 可继续添加更多元素,比如Fe、Cu、Zn等
};

步骤2:在Compound类构造函数中添加校验逻辑

在Compound的构造函数里,我们需要先解析化合物名称、提取元素符号,再逐一校验。这里要注意化学元素符号的规则:首字母大写,后面可以跟小写字母(比如Na、Fe),同时要跳过化学式里的数字下标:

class Compound {
private:
    std::string compoundname;

    // 辅助函数:从化合物名称中提取下一个元素符号
    std::string extract_next_element(const std::string& name, size_t& pos) {
        if (pos >= name.size()) return "";
        // 元素符号必须以大写字母开头
        if (!std::isupper(name[pos])) {
            throw std::invalid_argument("Invalid format: element must start with uppercase letter");
        }
        std::string element;
        element += name[pos];
        pos++;
        // 检查是否有后续的小写字母(比如Na的第二个a)
        if (pos < name.size() && std::islower(name[pos])) {
            element += name[pos];
            pos++;
        }
        return element;
    }

public:
    Compound(const std::string& name) {
        size_t pos = 0;
        while (pos < name.size()) {
            std::string element = extract_next_element(name, pos);
            // 校验元素是否有效
            if (valid_elements.find(element) == valid_elements.end()) {
                throw std::invalid_argument(element + " is an invalid element");
            }
            // 跳过化学式中的数字下标(比如O4里的4)
            while (pos < name.size() && std::isdigit(name[pos])) {
                pos++;
            }
        }
        // 只有所有元素校验通过,才给成员变量赋值
        compoundname = name;
    }

    // 可选:获取化合物名称的方法
    std::string get_name() const {
        return compoundname;
    }
};

步骤3:创建对象并处理异常

在实例化Compound对象时,用try-catch块捕获异常,就能得到你想要的错误提示:

#include <iostream>

int main() {
    try {
        // 尝试创建包含无效元素的化合物
        Compound sodiumsalt("NMmO4");
        std::cout << "Compound created successfully: " << sodiumsalt.get_name() << std::endl;
    } catch (const std::invalid_argument& e) {
        // 输出错误信息
        std::cerr << "Error: " << e.what() << std::endl;
    }
    return 0;
}

运行效果

当你尝试创建sodiumsalt("NMmO4")时,程序会输出:

Error: Mm is an invalid element

关键细节说明

  • 异常抛出时机:在构造函数中只要发现无效元素就立刻抛出异常,此时对象还未完成初始化,完全符合你“阻止创建对象”的需求。
  • 解析逻辑适配性:遵循化学元素符号的命名规则,同时自动跳过数字下标,能适配大多数基础化学式的解析。
  • 可扩展性:后续只需往valid_elements集合里添加更多元素符号,就能支持更多化合物的校验。

内容的提问来源于stack exchange,提问作者Pranav Taysheti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:30:30